Java 如何正确地从rgb565转换为rgb888
我正在尝试将一个值从rgb565转换为rgb888,但似乎无法正确获得它。 我还检查了一些现有的答案,如,但有些值似乎没有正确转换 以下是我迄今为止所尝试的:Java 如何正确地从rgb565转换为rgb888,java,colors,bit-manipulation,processing,Java,Colors,Bit Manipulation,Processing,我正在尝试将一个值从rgb565转换为rgb888,但似乎无法正确获得它。 我还检查了一些现有的答案,如,但有些值似乎没有正确转换 以下是我迄今为止所尝试的: PImage picker; int c; void setup(){ size(285,240); picker = loadImage("hsv.gif"); int c = color(255,255,255); byte[] word = colorToWord(c); int[] rgb = wordToRG
PImage picker;
int c;
void setup(){
size(285,240);
picker = loadImage("hsv.gif");
int c = color(255,255,255);
byte[] word = colorToWord(c);
int[] rgb = wordToRGB(word);
noStroke();
fill(c);
rect(0,0,50,100);
fill(rgb[0],rgb[1],rgb[2]);
rect(50,0,50,100);
}
void draw(){
image(picker,0,0);
if((mouseX >= 0 && mouseX <= picker.width)&&
(mouseY >= 0 && mouseY <= picker.height)) c = picker.get(mouseX,mouseY);
byte[] word = colorToWord(c);
int[] rgb = wordToRGB(word);
// int[] rgb = rgbWordToRGB(word);
int cc = color(rgb[0],rgb[1],rgb[2]);
fill(c);
rect(0,159,142,80);
fill(cc);
rect(142,159,143,80);
fill(0);
text("original\n"+hex(c),10,185);
text("converted\n"+hex(cc),152,185);
}
byte[] colorToWord(int c){
int r = (c >> 16) & 0xFF;
int g = (c >> 8) & 0xFF;
int b = c & 0xFF;
return new byte[]{(byte)((r&248)|g>>5),(byte)((g&28)<<3|b>>3)};
}
int[] wordToRGB3(byte[] data){
// Reconstruct 16 bit rgb565 value from two bytes
int rgb565 = (data[0] & 255) | ((data[1] & 255) << 8);
// Extract raw component values (range 0..31 for g and b, 0..63 for g)
int b5 = rgb565 & 0x1f;
int g6 = (rgb565 >> 5) & 0x3f;
int r5 = (rgb565 >> 11) & 0x1f;
// Scale components up to 8 bit:
// Shift left and fill empty bits at the end with the highest bits,
// so 00000 is extended to 000000000 but 11111 is extended to 11111111
int b = (b5 << 3) | (b5 >> 2);
int g = (g6 << 2) | (g6 >> 4);
int r = (r5 << 3) | (r5 >> 2);
return new int[]{r,g,b};
}
int[] wordToRGB2(byte[] word){
int r = word[0]&248;
int g = (word[0]<<5) | ((word[1]&28)>>3);
int b = word[1] << 3;
r <<= 3;
g <<= 2;
b <<= 3;
return new int[]{r,g,b};
}
int[] wordToRGB(byte[] word){
int c = (word[0] << 8) | (word[1]);
//RGB565
int r = (c >> (6+5)) & 0x01F;
int g = (c >> 5) & 0x03F;
int b = (c) & 0x01F;
//RGB888 - amplify
r <<= 3;
g <<= 2;
b <<= 3;
return new int[]{r,g,b};
}
final int RGB565_MASK_RED = 0xF800;
final int RGB565_MASK_GREEN = 0x07E0;
final int RGB565_MASK_BLUE = 0x001F;
int[] rgbWordToRGB(byte[] word){
int rgb565 = (word[0] << 8) | (word[1]);
int[] rgb24 = new int[3];
rgb24[2] = (rgb565 & RGB565_MASK_RED) >> 11;
rgb24[1] = (rgb565 & RGB565_MASK_GREEN) >> 5;
rgb24[0] = (rgb565 & RGB565_MASK_BLUE);
//amplify the image
rgb24[2] <<= 3;
rgb24[1] <<= 2;
rgb24[0] <<= 3;
return rgb24;
}
PImage选择器;
INTC;
无效设置(){
规模(285240);
picker=loadImage(“hsv.gif”);
int c=颜色(255255);
字节[]字=彩色字(c);
int[]rgb=wordToRGB(word);
仰泳();
填充(c);
rect(0,0,50100);
填充(rgb[0],rgb[1],rgb[2]);
rect(50,0,50100);
}
作废提款(){
图像(选择器,0,0);
如果((mouseX>=0&&mouseX=0&&mouseY>16)&0xFF;
int g=(c>>8)&0xFF;
intb=c&0xFF;
返回新字节[]{(字节)((r&248)| g>>5),(字节)((g&28)3)};
}
int[]字或GB3(字节[]数据){
//从两个字节重建16位rgb565值
int rgb565=(数据[0]和255)|(数据[1]和255)>5)和0x3f;
int r5=(rgb565>>11)和0x1f;
//将组件缩放至8位:
//向左移位并用最高位填充末尾的空位,
//所以00000扩展到000000000,但11111扩展到11111111
int b=(b5>2);
int g=(g6>4);
int r=(r5>2);
返回新的int[]{r,g,b};
}
int[]字TORGB2(字节[]字){
int r=字[0]&248;
int g=(字[0]3);
int b=word[1]好的,如果我理解正确,下面是修复方法:
在wordToRGB()方法中,替换第一行:
int c = (word[0] << 8) | (word[1]);
印刷品:
00000000000000000000000011111111
11111111111111111111111111111111
例2:
int a = 127;
println(binary(a));
int b = (byte) 127;
println(binary(b));
印刷品:
00000000000000000000000001111111
00000000000000000000000001111111
无论最后一位是什么,处理左边的焊盘时,基本上在这之后,您的|会扭曲所有值。好的,如果我理解正确,这里是修复方法:
在wordToRGB()方法中,替换第一行:
int c = (word[0] << 8) | (word[1]);
印刷品:
00000000000000000000000011111111
11111111111111111111111111111111
例2:
int a = 127;
println(binary(a));
int b = (byte) 127;
println(binary(b));
印刷品:
00000000000000000000000001111111
00000000000000000000000001111111
不管最后一位是什么,处理左边的pad时,基本上在那之后,你的|会扭曲所有的值。
是算术移位,所以它会对值进行符号扩展。使用逻辑移位>
在C中,没有>>
运算符,右移位取决于实现,但如果变量是无符号的,大多数将执行逻辑移位,因此只需将其强制转换或定义为无符号的>
是算术移位,因此它将对值进行符号扩展。请改用逻辑移位>
在C语言中,没有>
运算符,右移取决于实现,但如果变量是无符号的,大多数会进行逻辑移位,所以只要将其强制转换或定义为无符号的Hey dude:D,如果我可以添加一些代码来帮助在draw函数中调试:for(int I=0;I>
在C中始终是一个逻辑移位(毕竟,为什么要对不可能为负的整数进行符号扩展?)。它是有符号的,可以是算术的,也可以是逻辑的。谢谢Lưu,这很方便(+1)
在C中始终是一个逻辑移位(毕竟,为什么要对一个不可能为负的整数进行符号扩展呢?)。它是一个可以是算术或逻辑的有符号整数。