Java 是否有节省内存的graphics.drawImage()替代方案?
我需要在内存中保存约50张图像(这是必须的,也是我无法更改的条件)。然而,在某个时刻,我想在JFrame上绘制这些图像的缩略图 使用 绘制图像的大小调整版本效果良好,因为这样做不会消耗(或非常稀疏)内存。但是众所周知,drawImage中的缩放算法不是最好的,而且看起来很差 我尝试了Thumbnailator、JMagick和imgscalr来生成质量更好、外观整洁的缩略图结果。但是,有一个问题:它们的调用会消耗一些内存,因为它们正在创建新的BuffereImage对象 也就是说,以下代码保持了几乎恒定的内存使用率:Java 是否有节省内存的graphics.drawImage()替代方案?,java,image,swing,memory,scale,Java,Image,Swing,Memory,Scale,我需要在内存中保存约50张图像(这是必须的,也是我无法更改的条件)。然而,在某个时刻,我想在JFrame上绘制这些图像的缩略图 使用 绘制图像的大小调整版本效果良好,因为这样做不会消耗(或非常稀疏)内存。但是众所周知,drawImage中的缩放算法不是最好的,而且看起来很差 我尝试了Thumbnailator、JMagick和imgscalr来生成质量更好、外观整洁的缩略图结果。但是,有一个问题:它们的调用会消耗一些内存,因为它们正在创建新的BuffereImage对象 也就是说,以下代码保持了
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) 是否可以就地调整图像大小,在不创建新图像对象的情况下操作内部结构(例如:scaleInPlace(图像,100100)而不是Image=scale(图像,100100))
谢谢你的帮助!:)
PS:我知道我的代码示例不是向JFrame绘制图像的推荐方法,它只是一个快速示例
frame.getGraphics().drawImage(x,100,100,null)代码>不是正确的方式,你必须,是今天Swing需要的,以放置在那里JPanel
(覆盖getPreferredSize
),并在paitComponent
内部存储为本地变量的drawImage
getScaledInstance
非常异步同意
getGraphics()
;我不想冒犯你,但我想你不明白我的问题。1.GetScaleInstance消耗大量内存。尝试将第二个示例中的第13行和第14行替换为以下内容:Image d=i.getScaledInstance(100100,Image.SCALE\u默认值);frame.getGraphics().drawImage(d,100,100,null)代码>内存将不断上升,就像我使用Thumbnailator一样(第二个示例)。这个方法的文档说明“返回了一个新的图像对象”,这就是内存消耗的原因,也是我试图避免的。“PS:我知道我的代码示例不是将图像绘制到JFrame的推荐方法,它只是一个快速示例[演示内存使用]。”^^3。请详细说明这将如何帮助我:/1。是否将缩放图像保存到局部变量或图像数组2。与所有规则相反,则输出为3。不知道你的意思是什么
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) {}
}