这是一个问题,我是否使用正确的方式。我的意思是,通过正确的方式,是否有更节省内存的方法来做到这一点?
我使用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(它不是真正的最终......但我不能在这个上下文中使用final,因为它需要在构造函数之外使用(你在这里看不到,但它是))这是用作模板,一个用于编辑和绘制。
更多信息:在尝试这种方式之前,我这样做了:
String imgurl = "imgreadertest8.png";
BufferedImage loadedimage = ImageIO.read(getClass().getResource(imgurl));
BufferedImage image = loadedimage;
但是当我编辑图像时,它也会编辑loadedimage。几乎是因为它们是同一个物体。
那么......有没有其他方法可以设置此图像的亮度,而不会加载相同的图像两次?
答案 0 :(得分: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来处理图像,那也可能是一个选项。