有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java RGB颜色量化从8位到6位

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


共 (1) 个答案

  1. # 1 楼答案

    这里有两个问题:

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

    你的访问代码有点奇怪,所以我不能担保,但这应该很容易修复:你的代码可以使你的图像灰度化吗?如果没有,那就从解决这个问题开始

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

    r >>= 2;
    g >>= 2;
    b >>= 2;
    int pix = (r << 12) | (g << 6) | b;