【问题标题】:Using setRGB() method in BufferedImage在 BufferedImage 中使用 setRGB() 方法
【发布时间】:2014-04-03 01:36:22
【问题描述】:

我可以成功地在图像文件中读取和写入值,该文件准确地显示了创建的图像。

我只是使用 getRGB() 读取值,然后将它们分别移位到红色、绿色和蓝色数组中。然后我只需使用 setRGB() 方法将它们设置回另一个 BufferedImage 对象。

现在,我正在尝试更改像素值,比如红色阵列的第一个像素。然后我打印出红色数组的前 5 个像素,第一个值在调用 setRGB() 方法之前按预期更改,但是当我再次读入该图像时,第一个值现在恢复到其原始值?

有人知道使用 setRGB() 只会更改内存中的值,但实际上并不会写入更改后的值吗?

编辑 - 这是我的代码的示例表示(由于取回图像,这非常有效)

//READ IN IMAGE
BufferedImage imgBuf =null;
imgBuf = ImageIO.read(new File("test.jpg"));

int w = imgBuf.getWidth();
int h = imgBuf.getHeight();
int[] RGBarray = imgBuf.getRGB(0,0,w,h,null,0,w);

//BIT SHIFT VALUES INTO ARRAY
for(int row=0; row<h; row++)
      {
         for(int col=0; col<w; col++)
         {
            alphaPixels[row][col] = ((RGBarray[g]>>24)&0xff);
            redPixels[row][col] = ((RGBarray[g]>>16)&0xff);
            greenPixels[row][col] = ((RGBarray[g]>>8)&0xff);
            bluePixels[row][col] = (RGBarray[g]&0xff);
            g++;
         }
      }

//BIT SHIFT VALUES BACK TO INTEGERS
for(int row=0; row<h; row++)
{
    for(int col=0; col<w; col++)
    {
        int rgb = (alphaPixels[row][col] & 0xff) << 24 | (redPixels[row][col] & 0xff) << 16 | (greenPixels[row][col] & 0xff) << 8 | (bluePixels[row][col] & 0xff);
        imgBuf.setRGB(col, row, rgb);
     }
}

//WRITE IMAGE BACK OUT
ImageIO.write(imgBuf, "jpeg", new File("new-test.jpg"));

【问题讨论】:

    标签: java rgb bufferedreader


    【解决方案1】:

    写在哪里?如果您更改 BufferedImage 光栅的 RGB 值,那么是的,内存值将被写入并更改。如果您的意思是它是否将其更改为磁盘?不,除非您自己将图像写入磁盘,通常使用ImageIO.write(...)。更改磁盘数据的内存表示不会在数学上改变它自己的磁盘表示;相反,您必须使用您的代码明确地执行此操作。我认为您可能错过了最后一个重要步骤。


    编辑
    您在评论中声明:

    目前我可以用新名称写入磁盘上创建的图像。因此,如果这有效,那么改变一些值肯定会产生相同的效果吗? (使用 setRBG() )

    我还不清楚这一点。比如说:

    • 如果磁盘上有图像,例如 imageA.jpg,
    • 假设您通过 ImageIO.read(...) 将其读入 BufferedImage,例如读入 bufferedImageA 变量,
    • 然后通过setRGB(...) 更改数据栅格
    • 然后使用 ImageIO.write(...) 将更改后的 BufferedImage 写入磁盘,例如写入新文件 imageB.jpg,
    • 然后,如果您阅读 imageB.jpg,它应该会显示所做的更改。
    • 但是如果你重新读入未改变的imageA.jpg文件,它会保持不变。

    【讨论】:

    • 目前我可以用新名称写入磁盘上创建的映像。因此,如果这有效,那么改变一些值肯定会产生相同的效果吗? (使用 setRBG() )
    • @DouglasGrealis:请澄清您上面的陈述,因为我很难理解它。您在原始问题中没有显示任何代码,因此我们不知道您实际上在做什么。
    • 我已经编辑了我的最后一条评论。另外,我正在使用 write() 方法,该方法接收一个 BuffereImage 对象,其值是通过 setRBG() 设置的?
    • @DouglasGrealis:对不起,我还是不清楚。请参阅我的答案的编辑。请尽量详细说明您在做什么。
    • 是的,我明白这一点。这正是我所拥有的。只有我有两个 BufferedImage 变量。我使用一个读取图像值,然后使用另一个使用数组将值写回。这工作正常。但是当我尝试在将数组中的值写回磁盘之前更改它们时,它保持不变吗? (当然,然后我会阅读更改后的图像)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多