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是多余的。非常感谢您的解释,它现在工作得非常好。非常感谢您的解释,它现在工作得非常好