在BufferedImage中使用setRGB()方法

时间:2014-04-03 01:36:22

标签: java rgb bufferedreader

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

我只是使用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"));

1 个答案:

答案 0 :(得分:2)

写在哪里?如果更改BufferedImage栅格的RGB值,则会写入并更改内存值。如果你的意思是它将它改为磁盘?不,除非您自己将图像写入磁盘,通常使用ImageIO.write(...)。对磁盘数据的内存表示的更改不会在数学上以数学方式更改磁盘表示本身;相反,你必须用你的代码明确地这样做。我想你可能错过了最后一个重要的步骤。


修改
您在评论中说明:

  

目前,我可以使用新名称写入磁盘上创建的图像。那么如果这样可行,那么肯定改变一些值应该是同样的效果? (使用setRBG())

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

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