我想将RGB颜色从8位量化为6位。我编写了如下代码:
int ind = 0;
for(int y = 0; y < height; y++){
for(int x = 0; x < width; x++){
byte a = 0;
byte r = bytes[ind];
byte g = bytes[ind+height*width];
byte b = bytes[ind+height*width*2];
int pix = 0xff000000 | ((r & 0xff) << 16) | ((g & 0xff) << 8) | (b & 0xff);
img.setRGB(x,y,pix);
ind++;
}
}
然后,我改变了:
int pix = 0xff000000 | ((r & 0xff) << 16) | ((g & 0xff) << 8) | (b & 0xff);
要:
int pix = 0xff000000 | ((r & 0xff) << 12) | ((g & 0xff) << 6) | (b & 0xff);
因为我认为这意味着每个通道每像素6比特,我不知道我的理解是对还是错,输出图像真的很奇怪。我希望有人可以帮我解决问题
答案 0 :(得分:0)
这里有两个问题:
您的访问代码有点奇怪,所以我无法保证,但这应该很容易修复:您的代码是否适用于使您的图像灰度?如果没有,那么先修复它。
现在,将8位通道转换为6位通道的代码看起来不正确。您正在使用0xff对字节值进行AND运算,这是没有意义的,然后您无法将这些值缩小到6位,然后将它们进行OR运算。缩小到6位是通过右移2来完成的。所以,我认为你需要这样的东西:
r >>= 2;
g >>= 2;
b >>= 2;
int pix = (r << 12) | (g << 6) | b;