1

メモリに最大 50 個の画像を保持する必要があります (これは必須であり、変更できない条件です)。ただし、ある時点で、これらの画像のサムネイルを JFrame に描画したいと考えています。

使用する

graphics.drawImage(picture, 100, 100, 100, 100, null);

画像のサイズ変更されたバージョンを描画することは、そのために消費されるメモリがない (または非常にまばらな) ため、うまく機能します。しかし、drawImage のスケーリング アルゴリズムは最適ではなく、見栄えが悪いことが知られています。

Thumbnailator、JMagick、および imgscar を試して、より高品質で見栄えの良いサムネイル結果を生成しました。ただし、問題があります。これらの呼び出しは、新しい BufferedImage オブジェクトを作成しているため、メモリを消費します。

そうは言っても、次のコードはほぼ一定のメモリ使用量を保持しています。

BufferedImage i = null;
JFrame frame = new JFrame();
frame.setSize(500, 500);
frame.setVisible(true);

try {
    i = ImageIO.read(new File("season.jpg"));
} catch (IOException e1) {}

while (true)
{
    frame.getGraphics().drawImage(i, 100, 100, 100, 100, null);

    try {
    Thread.sleep(1000);
    } catch (InterruptedException e) {}
}

ただし、次のコードはメモリ消費量が増え続けます。

BufferedImage i = null;
JFrame frame = new JFrame();
frame.setSize(500, 500);
frame.setVisible(true);

try {
    i = ImageIO.read(new File("season.jpg"));
} catch (IOException e1) {}

while (true)
{
    BufferedImage x;
    try {
        x = Thumbnails.of(i).size(100, 100).keepAspectRatio(false).asBufferedImage();
        frame.getGraphics().drawImage(x, 100, 100,  null);
    } catch (IOException e1) {}

    try {
        Thread.sleep(1000);
    } catch (InterruptedException e) {}
}

だから、私が求めているのは:

a)画像のサイズ変更されたバージョンをJFrameに描画するためのメモリ効率の良い代替手段はありますか? または b) 新しい Image オブジェクトを作成せずに内部構造を操作して、その場で画像のサイズを変更することは可能ですか?

助けてくれてありがとう!:)

PS: 私のコード例は、JFrame に画像を描画するための推奨される方法ではないことを知っています。これは単なる簡単な例です。

4

1 に答える 1

2
  1. このcontianerに JComponent が含まれていない場合は、JLabel で Icon/ImageIcon を使用します。

  2. frame.getGraphics().drawImage(x, 100, 100, null);適切な方法ではありません、あなたがしなければならない、今日のSwingがそこに置く必要がありJPanel(オーバーライドgetPreferredSize)、内部paitComponentからdrawImageローカル変数として保存されますgetScaledInstance

  3. getScaledInstanceかなり非同期で、

于 2013-10-28T12:12:20.257 に答える