Java 稀释纯白的颜色量化

Java 稀释纯白的颜色量化,java,graphics,colors,java-2d,quantization,Java,Graphics,Colors,Java 2d,Quantization,我有一个简单的量化函数 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)

我有一个简单的量化函数

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;
}
公共静态整数量化(整数oldpoixel){
int r=(oldpoixel>>16)&0xff;
int g=(oldpoixel>>8)&0xff;
int b=(oldpoixel>>0)&0xff;

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

你可以将其乘以255/7,正好是36.428


您可以使用类似于
(int)((r/32)*(255.0/7.0))
,但Java中的强制转换很难看。为了改进这一点,您可以将其封装在函数中,并使用
量化通道(r)
量化通道(g)
量化通道(b)
。或者,您可以交换顺序并使用整数算术:
r/32*255/7

将每个组件除以32后,将得到一个介于0和7之间的整数。您正在尝试将其映射回0到255的范围,以便0为0,7为255

你可以将其乘以255/7,正好是36.428


您可以使用类似于
(int)((r/32)*(255.0/7.0))
,但Java中的强制转换很难看。为了改进这一点,您可以将其封装在函数中,并使用
量化通道(r)
量化通道(g)
量化通道(b)
。或者您可以交换顺序并使用整数算术:
r/32*255/7

而不是
/32*32
,尝试
/32*33
。33有点帮助,在使用它之后,位36是更高的限制,并产生接近白色的颜色,尽管使用颜色选择工具检查显示其不完全相同,但这也会起到很好的作用一个临时解决方案,因为它不会影响黑色,谢谢!事实上,是的,36对于8个级别是正确的。(我考虑的是*17对于16个级别)你真的想做
/32*(255.0/7.0)
,正好是36.428,但它不是整数。顺便说一下,那些
(int)
强制转换是多余的。与其使用
/32*32
,不如试试
/32*33
。33稍微有点帮助,在使用它之后,36位是更高的限制,并产生接近白色的效果,尽管使用颜色选择工具检查显示不完全,但这将作为一种临时解决方法很好,因为它不会影响黑色,谢谢!实际上是的,对于8个级别,36是正确的。(我认为*17代表16个级别)你真的想做
/32*(255.0/7.0)
,正好是36.428,但它不是整数。顺便说一下,那些
(int)
cast是多余的。非常感谢您的解释,它现在工作得非常好。非常感谢您的解释,它现在工作得非常好