gpt4 book ai didi

java - 有没有一种内存效率高的替代方案来替代graphics.drawImage()?

转载 作者:行者123 更新时间:2023-11-30 04:10:52 26 4
gpt4 key购买 nike

我需要在内存中保存约 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) {}
}

所以,我要问的是:

有吗a) 将调整大小的图像版本绘制到 JFrame 的良好内存效率替代方案?或者b) 是否可以就地调整图像大小,操作内部结构而不创建新的 Image 对象(例如:scaleInPlace(image, 100, 100) 而不是 image = scale(image, 100, 100))?

感谢您的帮助! :)

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

最佳答案

  1. 在JLabel中使用Icon/ImageIcon,如果该容器不包含JComponent,可以使用 getScaledInstance存储具有(仅)合理像素比的图像,然后也是内存需求,然后可以将这些图像存储在局部变量中

  2. frame.getGraphics().drawImage(x, 100, 100, null);不是正确的方法,你必须,是今天的 Swing 需要的 JPanel (覆盖 getPreferredSize ),并在 paitComponent 内部至drawImage来自存储为本地变量 getScaledInstance

  3. getScaledInstance非常异步,

关于java - 有没有一种内存效率高的替代方案来替代graphics.drawImage()?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19633632/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com