2014-04-02 45 views
2

我可以读取图像并写入图像,图像看起来很完美。所以这就行了。在Java中使用BufferedImage

我觉得我在换位时遇到困难。因为当我测试打印前3个RGB int值,然后测试后打印3个int值时,它们没有相同的值?但是我再次运行该程序,第一个打印值与之前的第一个打印值相同?

OK,下面是代码时,我咬了移值到红,绿和蓝阵列

int g=0; 
for(int row=0; row<h; row++) 
{ 
    for(int col=0; col<w; col++) 
    { 
     redPixels[row][col] = ((RGBarray[g]>>16)&0xff); 
     greenPixels[row][col] = ((RGBarray[g]>>8)&0xff); 
     bluePixels[row][col] = (RGBarray[g]&0xff); 
     g++; 
    } 
} 

下面的代码位移值回整数...

for(int row=0; row<h; row++) 
{ 
    for(int col=0; col<w; col++) 
    { 
     int rgb = (redPixels[row][col] & 0xff) << 16 | (greenPixels[row][col] & 0xff) << 8 |(bluePixels[row][col] & 0xff); 
      bufferedImage.setRGB(col, row, rgb); 
    } 
} 

第一3个INT值的比特移位到阵列之前:比特移位回整数后-16573912 -16573912 -16508119

第一3个INT值:203304 203304 269097

但请记住,当我再次运行程序时,会显示完全相同的值(在本例中为上述相同的输出)。并且还创建了一个准确的图像。我只是不确定在位移之前和之后的值是不是一样的?

希望这个很清楚吗? 谢谢

回答

3

您的RGB值是24位(3 * 8),但是java int是32位。如果你看一下十六进制值,差别应该是比较明显的:

-16573912 = 0xFF031A28 
    203304 = 0x00031A28 
+2

在原来的数字开始额外'0xff'通常是指颜色的Alpha值,并且在这种情况下' 0xff'意味着完全不透明 – Sam

+0

所以我需要将最左边的8位移位成一个alpha数组,然后反过来回到一个rgb int以获得相同的值?谢谢 –

+1

@DouglasGrealis你可以额外储存阿尔法值,只需要按照你现在的方式来移动它(只需移动24)。或者,如果您知道alpha始终为0xff,则可以始终将0xff左移到结果中。就目前而言,您将Alpha保留在0x00,这意味着“完全透明” – Sam