当前位置: 首页 > 知识库问答 >
问题:

在BufferedImage中使用setRGB()方法

樊令秋
2023-03-14

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

有人知道使用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个答案

詹高畅
2023-03-14

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

编辑
您在注释中声明:

目前,我可以用一个新名称写到磁盘上创建的映像。所以如果这是有效的,那么改变几个值肯定会有同样的效果?(使用setRBG())

我还是不清楚。例如:

  • 如果磁盘上有图像,请输入imagea.jpg,
  • 并假设您通过imageio.read(...)将其读入BufferedImage,假设将其读入BufferedImage,
  • ,然后通过setrgb(...)
  • 更改数据栅格
  • 然后用imageio.write(...)将更改后的BufferedImage写入磁盘,例如写入一个新文件imageB.jpg,
  • 那么如果您在imageB.jpg中阅读,它应该显示所做的更改。
  • 但是如果重新读取未更改的imagea.jpg文件,它将保持不变。
 类似资料:
  • null 正如您所看到的,值从图像返回为-实际上,我更改的每个像素都返回为。我做错了什么?只是说不通。提前感谢!

  • **重要更新,见下文!** 我正在创建一个程序,当BufferedImage的像素满足Java中的一组条件时,它将像素更改为特定的颜色。但是,当我将图像写入磁盘时,应该着色的像素反而是黑色。 **当我这样做的时候: 我的输出文件是灰度的,所以这意味着setRGB实际上是在用灰度修改我的图片。我认为这实际上是一个相当简单的问题,但我无法解决。

  • 问题内容: 我已经检查了类似命名的问题,但是他们没有回答这个用例。 基本上,我要在给定的坐标(x,y)上覆盖一些文本(文本),我在包装中具有以下功能; 我觉得我似乎缺少明显的东西;我能找到的所有对Graphics2D的引用都涉及游戏或直接写入文件,但我只想返回BufferedImage。叠加层“已渲染” 在当前代码中,图像未更改地显示在末尾。 问题答案: 该方法使用x和y作为最左边字符的基线。数字

  • 问题内容: 使a饱和的最简单方法是什么? 问题答案: 用途: 更新: 确实有一种更简单的方法。您可以使用该类。该类的优点是它提供了一个静态实用程序方法(即),该方法将返回图像的变灰版本。 话虽如此,我认为使实例饱和的最简单方法是:

  • 问题内容: 我正在尝试加载一个图像文件(gif),该图像文件本地存储在与Eclipse Java项目相同的目录中: 是gif图像存储的相对路径。 使用上述方法的客户端代码是: 在Eclipse工作区中,在我的项目目录中,我有一个文件夹,其中存储了gif图像。但是客户端代码总是返回: 我在上面的方法中加载gif图片时做错了吗?在这种情况下,是否有更好的直接方法来执行文件查找? 非常感谢您的任何建议。

  • 我正在尝试旋转并将其显示在中(位于中)。当前结果产生一个白色正方形,在黑色背景下旋转10度,但图像不在正方形内。我知道不是空的,因为本身在不旋转时会正确地显示在中。 代码如下: