1

我想将 RGB 颜色从 8 位量化到 6 位。我编写的java代码如下:

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位,我不知道我的理解是对还是错,输出图像真的很奇怪。我希望有人能帮我弄清楚

4

1 回答 1

0

这里有两个问题:

  1. 您是否正确访问了 R、G、B 组件,以及
  2. 您是否正确组合组件。

您的访问代码有点奇怪,所以我不能保证,但这应该很容易解决:您的代码是否适用于使您的图像灰度化?如果没有,那么从修复它开始。

现在,您将 8 位通道转换为 6 位通道的代码看起来不正确。您正在使用 0xff 对字节值进行与运算,这是毫无意义的,然后您无法将这些值缩小到 6 位,然后再将它们组合在一起。缩小到 6 位是通过右移 2 来完成的。所以,我认为你需要这样的东西:

r >>= 2;
g >>= 2;
b >>= 2;
int pix = (r << 12) | (g << 6) | b;
于 2015-02-04T10:02:40.037 回答