RGB888到RGB565,反之亦然导致信息丢失?

时间:2014-01-14 11:43:53

标签: java colors rgb

我有以下代码将RGB565转换为RGB888,反之亦然:

public static void main(String[] args) {
    // TODO code application logic here
    System.out.println(Integer.toHexString(RGB888ToRGB565(0x11ffffff)));
    System.out.println(Integer.toHexString(RGB565ToRGB888(RGB888ToRGB565(0x7FC9FF))));
}

static int RGB888ToRGB565(int red, int green, int blue) {
    final int B = (blue >>> 3) & 0x001F;
    final int G = ((green >>> 2) << 5) & 0x07E0;
    final int R = ((red >>> 3) << 11) & 0xF800;

    return (R | G | B);
}

static int RGB888ToRGB565(int aPixel) {
    //aPixel <<= 8;
    //System.out.println(Integer.toHexString(aPixel));
    final int red = (aPixel >> 16) & 0xFF;
    final int green = (aPixel >> 8) & 0xFF;
    final int blue = (aPixel) & 0xFF;
    return RGB888ToRGB565(red, green, blue);
}

static int RGB565ToRGB888(int aPixel) {
    final int b = (((aPixel) & 0x001F) << 3) & 0xFF;
    final int g = (((aPixel) & 0x07E0) >>> 2) & 0xFF;
    final int r = (((aPixel) & 0xF800) >>> 8) & 0xFF;
    // return RGBA
    return 0x000000ff | (r << 24) | (g << 16) | (b << 8);
}

问题出现在第二行,当它变回rgb888时,我失去了颜色信息。任何了解更多关于位移和屏蔽的人都可以帮助我吗?

提前致谢!

2 个答案:

答案 0 :(得分:0)

这条线不对吗?

final int g = (((aPixel) & 0x07E0) >>> 2) & 0xFF;

应该是:

final int g = (((aPixel) & 0x07E0) >>> 3) & 0xFF;

在我看来,其余代码看起来还不错。我不知道是否能解释它。否则你可能必须根据什么测试来定义“那么大的损失”。

答案 1 :(得分:0)

static int RGB888ToRGB565(int aPixel)中,您期望ARGB(或仅RGB)作为输入

static int RGB565ToRGB888(int aPixel)中,您将RGBA作为输出返回

在同一代码中使用ARGB和RGBA似乎不合逻辑。我的猜测是你在比较之后的颜色时混淆了吗?

除了上面的肖恩欧文斯评论是正确的