在Java中使用BuffereImage

在Java中使用BuffereImage,java,rgb,bufferedimage,Java,Rgb,Bufferedimage,我可以读入图像并对图像进行写入,图像看起来非常完美。所以没关系 我想我的钻头移动有困难。因为当我测试打印前3个RGB int值,然后测试打印后3个int值时,它们的值不相同?但是当我再次运行程序时,第一个打印值与之前的第一个打印值相同吗 好的,下面是我将值移位为红色、绿色和蓝色数组时的代码 int g=0; for(int row=0; row<h; row++) { for(int col=0; col<w; col++) { redPixels[r

我可以读入图像并对图像进行写入,图像看起来非常完美。所以没关系

我想我的钻头移动有困难。因为当我测试打印前3个RGB int值,然后测试打印后3个int值时,它们的值不相同?但是当我再次运行程序时,第一个打印值与之前的第一个打印值相同吗

好的,下面是我将值移位为红色、绿色和蓝色数组时的代码

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++;
     }
}
intg=0;
对于(int行=0;行16)&0xff);
绿色像素[row][col]=((RGBarray[g]>>8)和0xff);
蓝色像素[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);
     }
}

for(int row=0;row您的RGB值是24位(3*8),而java int是32位。如果查看十六进制值,差异应该更明显:

-16573912 = 0xFF031A28
   203304 = 0x00031A28

原始数字开头的额外的
0xff
通常指颜色的alpha值,在这种情况下
0xff
表示完全不透明,所以我需要将最左边的8位位移位到alpha数组中,然后反过来移回rgb int以获得相同的值吗?Thanks@DouglasGrealis你可以储存阿尔法另外,只需按与当前相同的方式移动它(只需移动24)。或者,如果您知道alpha始终为0xff,则可以始终将0xff向左移动到结果中。目前,您将alpha保留为0x00,这意味着“完全透明”@DouglasGrealis-这还取决于您使用的颜色模型(也就是说,它是否使用alpha,类似于类型_INT_ARGB)。啊,好的。是的,我实际上使用类型_INT_RGB。但是谢谢你的帮助。只需要澄清一下