0

这是一个问题,我是否使用正确的方法。通过正确的方式,我的意思是,有没有一种更节省内存的方式来做到这一点?

我使用 1 个图像源:

String imgurl = "imgreadertest8.png";
  BufferedImage loadedimage = ImageIO.read(getClass().getResource(imgurl));
  BufferedImage image = ImageIO.read(getClass().getResource(imgurl));

我在 paint() 方法中绘制图像。但有时我需要设置亮度:

public void setBrightness(float brightness)
{
    RescaleOp rescaleOp = new RescaleOp(brightness, 15, null);
    rescaleOp.filter(loadedimage, image);
}

所以我读了同一张图片,两次。一个有一个“最终”的 BufferedImage (它不是真正的最终......但我不能在这种情况下使用最终,因为它需要在构造函数之外使用(你在这里看不到,但它是))这是用作模板,用于编辑和绘制。

更多信息:在尝试这种方式之前,我这样做了:

String imgurl = "imgreadertest8.png";
  BufferedImage loadedimage = ImageIO.read(getClass().getResource(imgurl));
  BufferedImage image = loadedimage;

但是当我编辑图像时,它也会编辑加载的图像。几乎是因为它们是同一个对象。

所以......有没有另一种方法来设置这个图像的亮度,而不加载同一个图像两次?

4

1 回答 1

0

以下将复制图像。

public static BufferedImage copy(BufferedImage img) {
    Hashtable<?,?> properties = new Hashtable<>();
    for (String propertyName : img.getPropertyNames()) {
        properties.put(propertyName, img.getProperty(propertyName));
    }
    return new BufferedImage(img.getColorModel(),
            img.copyData(null),
            img.isAlphaPremultiplied(), properties);

}

通过创建一个空图像,绘制createGraphics它(不要忘记处置),可以更慢但更简单地实现同样的事情。如果您需要 Graphics2D 来处理图像,那也可能是一种选择。

于 2013-03-11T14:55:32.737 回答