Java RGB888到RGB565,反之亦然,是否会导致信息丢失?

Java RGB888到RGB565,反之亦然,是否会导致信息丢失?,java,colors,rgb,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(RGB888ToR

我有以下代码将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);
}
publicstaticvoidmain(字符串[]args){
//此处的TODO代码应用程序逻辑
System.out.println(Integer.toHexString(RGB888ToRGB565(0x11ffffff));
System.out.println(Integer.toHexString(RGB565ToRGB888(RGB888ToRGB565(0x7FC9FF)));
}
静态内部RGB888ToRGB565(内部红色、内部绿色、内部蓝色){
最终整数B=(蓝色>>>3)和0x001F;
最终整数G=((绿色>>>2)>>3)>8)和0xFF;
最终整数蓝色=(aPixel)&0xFF;
返回RGB888ToRGB565(红色、绿色、蓝色);
}
静态整数RGB565ToRGB888(整数aPixel){
最终整数b=((aPixel)和0x001F)>>2)和0xFF;
最终整数r=((aPixel)和0xF800)>>>8)和0xFF;
//返回RGBA
返回0x000000ff |(r这行不是错了吗

final int g = (((aPixel) & 0x07E0) >>> 2) & 0xFF;
应该是:

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

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

静态int-RGB888ToRGB565(int-aPixel)
中,您期望ARGB(或只是RGB)作为输入

静态int-RGB565ToRGB888(int-aPixel)
中,返回RGBA作为输出

在同一个代码中使用ARGB和RGBA似乎不合逻辑。我猜你是在事后比较颜色时弄混的


除此之外,肖恩·欧文斯(Sean Owens)的上述评论是正确的

你检查过了吗?当然有损失。你为什么认为没有损失?是的,我有,但这没有真正起到作用。我知道应该有损失,但我不认为会有那么多损失。你的问题是1)颜色变得不那么详细,或者2)颜色被不正确的转换破坏了?如果是前者,这是显而易见的,也是不可避免的。(通过从rgb888转换到rgb565再转换回来,你实际上破坏了三分之一的数据,将可能的颜色数量切割到原来的1/256)如果是后者,你能提供一个它是如何损坏的例子吗?不,颜色实际上完全损坏了,有时它返回的值甚至不接近原始值。嗯,不,这只是导致它返回一个更不正确的输出。嗯,行是错的,对吗?值是+5移位,所以你需要将其移位-3以从8位字节的顶部开始。您尚未说明问题所在。什么输出与预期输出不匹配。