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);
}

同じ画像を 2 回読みました。「最終」の BufferedImage を持つもの (実際には最終的なものではありません...しかし、コンストラクターの外部で使用する必要があるため、このコンテキストでは最終的に使用できません (ここでは表示されませんが、そうです))。テンプレートとして使用され、1 つは編集および描画に使用されます。

詳細:この方法を試す前に、次のことを行いました。

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

しかし、画像を編集すると、読み込まれた画像も編集されます。それらは同じオブジェクトだからです。

だから...同じ画像を2回ロードせずに、この画像の明るさを設定する別の方法はありますか?

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 に答える