【问题标题】:Color quantization diluting pure whites颜色量化稀释纯白色
【发布时间】:2016-06-17 18:18:42
【问题描述】:

我有一个简单的量化函数

public static int quantize(int oldpixel) {

    int r = (oldpixel >> 16) & 0xff;
    int g = (oldpixel >> 8) & 0xff;
    int b = (oldpixel >> 0) & 0xff;

    int color = 0xff << 24 | (((int) ((r) / 32) * 32) & 0xff) << 16 | 
            (((int) ((g) / 32) * 32) & 0xff) << 8 | 
            (((int) ((b) / 32) * 32)& 0xff) << 0;
    return color;
}

它所做的是将颜色减少到较低细节的颜色,然后将其扩展,这会人为地限制托盘,我会将其用于抖动过滤器,通过该功能的图像会产生此效果

在: Unquantized hue wheel 出去: Quantized hue wheel

结果这几乎是完美的,除了白色被减少为灰色,我理解原因是我在算法中的分色地板,但我不知道如何解决这个问题,任何建议将不胜感激

【问题讨论】:

  • 试试/ 32 * 32,而不是/ 32 * 33
  • 33 有一点帮助,在玩过它之后,36 位是上限并产生接近白色,尽管使用颜色选择工具进行检查显示它并不完全,但这将作为临时解决方法工作得很好不影响黑色,谢谢!
  • 实际上是的,36 对 8 个级别是正确的。 (我在考虑 *17 为 16 个级别)
  • 你真的想做/ 32 * (255.0 / 7.0),它恰好是大约 36.428,但它不是一个整数。
  • 顺便说一句,那些(int) 演员表是多余的。

标签: java graphics colors java-2d quantization


【解决方案1】:

将每个分量除以 32 后,得到一个介于 0 和 7 之间的整数。您试图将其映射回 0 到 255 的范围,因此 0 是 0,7 是 255。

您可以通过将其乘以 255/7 来做到这一点,这恰好是 36.428 左右。

您可以使用(int)((r / 32) * (255.0 / 7.0)) 之类的东西,但Java 中的演员阵容很难看。为了改善这一点,您可以将其包装在一个函数中,并拥有quantizeChannel(r)quantizeChannel(g)quantizeChannel(b)。或者您可以交换顺序并使用整数运算:r / 32 * 255 / 7

【讨论】:

  • 非常感谢您的解释,它现在完美运行
猜你喜欢
  • 1970-01-01
  • 2017-08-20
  • 1970-01-01
  • 1970-01-01
  • 2015-11-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多