1

我正在开发一个应用程序,该应用程序在文件夹中获取图像并将它们显示为缩略图,以便单独进行进一步选择和操作。下面是将它们添加到 Jtogglebuttons 的代码。

toglBtn=new JToggleButton(""+i,new ImageIcon(ImageIO.read(new File(listOfFiles[i].getAbsolutePath())).getScaledInstance(139, 163, BufferedImage.SCALE_SMOOTH)));

我在文件夹中的原始图像小于 100kb,但 Jtogglebutton 大小为 6mb。有没有办法减少这些的大小?目前它占用了我所有的堆空间并在有超过 40 个文件时给我一个内存不足错误。我已经将堆大小增加到 512MB,但是在使用 MAT 分析堆转储后,我想我需要减小缩略图大小来解决这个错误。

有什么办法可以强制缩略图成为 jpeg?或任何其他将缩略图添加到 jtogglebuttons 的方式?

最后更新:我使用缩略图将按钮的大小缩小到几 kb

try{
                            BufferedImage originalImage = ImageIO.read(new File(listOfFiles[i].getAbsolutePath()));                             
                            Image image =Thumbnails.of(originalImage).size(138, 163).asBufferedImage();
                            toglBtn=new JToggleButton(""+i,new ImageIcon(image));
                            }
4

1 回答 1

1

也许您的一个 Java 行将原始图像、缩放图像和图像图标保存在内存中。

通过这种方式分解代码可确保丢弃原始图像和缩放图像以进行垃圾收集。

import java.awt.Image;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;

import javax.imageio.ImageIO;
import javax.swing.ImageIcon;
import javax.swing.JToggleButton;

    String text = "" + i;
    File imageFile = new File(listOfFiles[i].getAbsolutePath());
    BufferedImage image = ImageIO.read(imageFile);
    Image scaledImage = image.getScaledInstance(139, 163, 
            BufferedImage.SCALE_SMOOTH);
    ImageIcon imageIcon = new ImageIcon(scaledImage);
    toglBtn = new JToggleButton(text, imageIcon);
于 2013-02-07T14:30:05.797 回答