好的,我使用以下代码从文件中提取了RGB值:
int r = cBuffer[1024*0+32*(j/32)+(j%32)] & 0xFF;
int g = cBuffer[1024*1+32*(j/32)+(j%32)] & 0xFF;
int b = cBuffer[1024*2+32*(j/32)+(j%32)] & 0xFF;
" anding"完成0xFF是因为我想将字节值转换为无符号表示。
现在我使用以下代码形成实际像素 - :
int pixel = (r << 16) | (g << 8) | b;
现在的问题是,当我打印(使用SOP(像素))像素的值时,我得到如下数字 - :
Computed Pixel = -11119787
Computed Pixel = -13884637
Computed Pixel = -14081500
Computed Pixel = -12436417
我知道像素计算是正确的,因为我使用这些值后获得的图像是有效的。
现在我的问题是 - :
答案 0 :(得分:2)
像素值不应该介于0到255之间吗?
不,你应该知道,因为你正在处理移位字节等.0-255将是无符号字节的值范围,因为像素值通常由3个8位(即3字节)值组成,结果int
的绝对值会更高。
在给定rgb值的情况下,有什么方法可以表示0到255之间的像素值?这甚至是一个正确的代表吗?
不,如上所述,24位像素值不能在0到255范围内表示。您通常代表该范围内的每个分量(r,g,b),即像素将包含3个值在0-255范围内。
有些表示允许您将像素映射到0-255,但是由于您必须将其转换为灰度或将rgb值“压缩”为2或3,因此您将丢失大量信息位值显然不能保存与8位值一样多的信息。
顺便说一句,我不确定你的rgb提取例程是否正确,或者至少看起来很复杂(你检查的值是否正确?)。假设cBuffer
是一个表示未压缩的32位颜色信息的字节数组,您可能只是得到这样的rgb值:
//assuming the buffer to be in rgba format, i.e. 32-bit pixels with alpha information in the last byte
for( int i = 0; i < cBuffer.length; i+=4) {
int r = cBuffer[i];
int b = cBuffer[i + 1];
int g = cBuffer[i + 2];
int a = cBuffer[i + 3];
//do whatever you want with the pixel
}
修改强>
根据您的评论,您希望获得范围[0.0,1.0]中的颜色值。在这种情况下,您将获得整数颜色值并将其除以最大颜色值(白色)。假设您有24位颜色(或32位argb并忽略alpha分量),您可以执行以下操作:
int w = 255 << 16 | 255 << 8 | 255; //white = 0x00FFFFFF
int r = 255 << 16; //red = 0x00FF0000
int g = 255 << 8; //green = 0x0000FF00
int b = 255; //blue = 0x000000FF
System.out.format( "white > int: %8d (real: %1.5f )\n", w, (double)w/w);
System.out.format( "red > int: %8d (real: %1.5f )\n", r, (double)r/w);
System.out.format( "green > int: %8d (real: %1.5f )\n", g, (double)g/w);
System.out.format( "blue > int: %8d (real: %1.5f )\n", b, (double)b/w);
输出:
white > int: 16777215 (real: 1,00000 )
red > int: 16711680 (real: 0,99609 )
green > int: 65280 (real: 0,00389 )
blue > int: 255 (real: 0,00002 )
答案 1 :(得分:0)
为什么像素有这样的任意值?不应该像素 值范围是0到255吗?
有什么办法可以表示介于0到255之间的像素值 rgb值?那会是正确的表示吗?
就像我在上面第二点中提到的那样,您可以用0到255之间的值表示每个RGB通道/字节。假设您已读取字节数组中的第一个像素(图像的左上角) 。
byte[] pixel = new byte[3];
/* code to read the pixel in this byte array */
int r = pixel[0] & 0xFF;
int g = pixel[1] & 0xFF;
int b = pixel[2] & 0xFF;
请注意通道字节的“与”为0xFF(255)。该操作使字节值变为无符号值。