2013-03-11 1 views
0

Это вопрос, я использую правильный путь или нет. И по правильному пути, я имею в виду, есть ли более эффективный с точки зрения памяти способ сделать это?Умножает BufferedImage, чтобы установить яркость правильно?

Я использую 1 источник изображения:

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

рисую изображение в методе краска(). Но иногда мне нужно установить яркость:

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

следующее копирование изображения.

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 его (не забыть Dispose). Если вам понадобится Graphics2D для обработки изображения, это тоже может быть вариант.