Java 图标图像最大文件大小

Java Icon Image Maximum File Size

我正在 Java 开发国际象棋游戏。我一直在将图像导入 Eclipse,然后将它们分配给 ImageIcons,然后将这些 ImageIcons 分配给按钮以形成网格。

有一次我的四张主教图像中有三张没有分配给它们各自的按钮,所以我查看了文件大小,结果发现没有分配的三张图像的大小是~ 1,100KB、~1,200KB 和~40KB。分配给按钮的图像大约为 25KB。我认为这很奇怪(特别是因为所有四个图像都非常相似)所以我以较低的分辨率(均低于 30KB)导出了三个有问题的图像,然后将它们重新导入到 Eclipse 中。当我再次 运行 我的程序时,它们被分配给了正确的按钮,并且一切都再次 运行 顺利。

我使用的按钮都是 75 x 75 像素,并且每个图像的像素都是相同的 (75 x 75),所以我很困惑为什么会这样。我寻找与此相关的任何问题,但找不到任何问题。如果有人可以帮助解释为什么这会发生在我身上,那将非常有帮助,这样我以后就可以避免这个问题。

我肯定已经将比 ImageIcons 和其他组件大得多的图像加载到 ImageIcons 和其他组件中,所以我怀疑你的问题是当你在图像完全加载之前将图像分配给 ImageIcon 时。您可以使用 MediaTracker 来帮助解决这个问题。来自 ImageIcon:

/** * Loads an image into memory */ 
public static Image loadImage(String fn){ 
  try { 
    Image image=java.awt.Toolkit.getDefaultToolkit().createImage(fn);
    MediaTracker tracker=new MediaTracker(lblForFM); tracker.addImage(image,0); 
    tracker.waitForID(0);
    if (MediaTracker.COMPLETE != tracker.statusID(0,false)) throw new 
       IllegalStateException("Unable to load image from " + fn); 
    else return image; } catch ( InterruptedException e) { 
      throw new RuntimeException("Interrupted while loading image from " + fn,e); 
    } 
} 

我建议对透明图像和图标使用 png,对非透明图像使用 jpg - 并且只有在压缩伪影无关紧要的情况下(lossless JPEG 遗憾的是并不广泛传播)。 bmp 是文件大小最差的文件格式之一。正如其他人所建议的那样,使用 ImageIO API:

在 java 中加载图像
public class Program {
    public static void main(String[] args) {
        InputStream imageSource = Program.class.getResourceAsStream("bishop"); // may be a URL, File or ImageInputStream instead
        try {
            BufferedImage bishopImage = ImageIO.read(imageSource); // read image
            ImageIcon bishopIcon = new ImageIcon(bishopImage); // use adapter for Icon interface
            System.out.println(bishopIcon); // do something with it
        } catch (IOException e) {
            e.printStackTrace(); // read failed
        }
    }
}