【问题标题】:Using BufferedImage in Java在 Java 中使用 BufferedImage
【发布时间】:2014-04-02 00:31:09
【问题描述】:

我可以读取图像并写入图像,图像看起来很完美。所以没关系。

我认为我的位移有困难。因为当我测试打印前 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++;
     }
}

以下是将值移位回整数的代码...

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

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

希望这很清楚吗? 谢谢

【问题讨论】:

    标签: java rgb bufferedimage


    【解决方案1】:

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

    -16573912 = 0xFF031A28
       203304 = 0x00031A28
    

    【讨论】:

    • 原始数字开头的额外0xff通常是指颜色的alpha值,在这种情况下0xff表示完全不透明
    • 那么我是否需要将最左边的 8 位移位到一个 alpha 数组中,然后反之亦然回到一个 rgb int 以获得相同的值?谢谢
    • @DouglasGrealis 您可以额外存储 alpha 值,并以与当前相同的方式对其进行移位(只需移位 24)。或者,如果您知道 alpha 始终为 0xff,您可以始终将 0xff 左移到结果中。就目前而言,您将 alpha 保留在 0x00,这意味着“完全透明”
    • @DouglasGrealis - 它还取决于您使用的颜色模型(即它是否使用 alpha,例如 TYPE_INT_ARGB)。
    • 嗯,好的。是的,我实际上使用的是 TYPE_INT_RGB。但感谢您的帮助。只是需要澄清
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-09-28
    相关资源
    最近更新 更多