1

我需要在内存中保存约 50 张图像(这是必须的,也是我无法改变的条件)。但是,有时我想在 JFrame 上绘制这些图像的缩略图。

使用

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

绘制图像的调整大小版本效果很好,因为这样做不会消耗(或非常稀疏)内存。但是众所周知,drawImage中的缩放算法并不是最好的,看起来很差。

我尝试过 Thumbnailator、JMagick 和 imgscalr 来生成质量更好、外观整洁的缩略图结果。但是,有一个问题:它们的调用会消耗一些内存,因为它们正在创建新的 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) {}
}

所以,我要问的是:

是否有一个良好的内存效率替代方法来将图像的调整大小版本绘制到 JFrame?或 b) 是否可以就地调整图像大小,在不创建新图像对象的情况下操纵内部结构(例如:scaleInPlace(image, 100, 100) 而不是 image = scale(image, 100, 100))?

感谢您的任何帮助!:)

PS:我知道我的代码示例不是将图像绘制到 JFrame 的推荐方式,它只是一个简单的示例。

4

1 回答 1

2
  1. 在此contianer不包含JComponent的情况下,在JLabel中使用Icon/ImageIcon,您可以使用getScaledInstance来存储具有(仅)合理像素比的图像,然后也需要内存,然后可以将这些图像存储在局部变量中

  2. frame.getGraphics().drawImage(x, 100, 100, null);不是正确的方式,你必须,今天的 Swing 需要放在那里JPanel(覆盖getPreferredSize),并且内部paitComponentto drawImagefrom 存储为本地变量 fromgetScaledInstance

  3. getScaledInstance相当异步,

于 2013-10-28T12:12:20.257 回答