Java 是否有节省内存的graphics.drawImage()替代方案?

Java 是否有节省内存的graphics.drawImage()替代方案?,java,image,swing,memory,scale,Java,Image,Swing,Memory,Scale,我需要在内存中保存约50张图像(这是必须的,也是我无法更改的条件)。然而,在某个时刻,我想在JFrame上绘制这些图像的缩略图 使用 绘制图像的大小调整版本效果良好,因为这样做不会消耗(或非常稀疏)内存。但是众所周知,drawImage中的缩放算法不是最好的,而且看起来很差 我尝试了Thumbnailator、JMagick和imgscalr来生成质量更好、外观整洁的缩略图结果。但是,有一个问题:它们的调用会消耗一些内存,因为它们正在创建新的BuffereImage对象 也就是说,以下代码保持了

我需要在内存中保存约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绘制图像的推荐方法,它只是一个快速示例

  • 在JLabel中使用Icon/ImageIcon如果此容器不包含JComponent,则可以使用以(仅)合理的像素比存储图像,然后使用内存需求,然后可以将这些图像存储在局部变量中

  • 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) {}
    }