【问题标题】:Java Icon Image Maximum File SizeJava 图标图像最大文件大小
【发布时间】:2015-08-06 12:50:12
【问题描述】:

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

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

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

【问题讨论】:

  • 您的图标使用什么文件格式?
  • “我觉得这很奇怪(特别是因为所有四个图像都非常相似)” 使用什么逻辑系统是 1.1 MB 的图像与另一个只有 25 KB 的图像“相似” ?为什么地球上的大的那么大?一个通用提示是使用ImageIO 加载图像 - 如果出现问题,它会提供更多..反馈。
  • @BinkanSalaryman 我使用的是 .jpg 文件
  • @AndrewThompson 我的意思是它们的相似之处在于每张照片的美感几乎相同,但由于某种原因,文件大小却截然不同
  • “我的意思是..” 是的,无论如何,但你能回答我的第二个问题并报告使用ImageIO 的结果吗?显然,这些“相同像素”的图像是使用......非常不同的格式编码的。

标签: java image swing filesize imageicon


【解决方案1】:

我肯定已经将比图像大得多的图像加载到 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); 
    } 
} 

【讨论】:

【解决方案2】:

我建议将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
        }
    }
}

【讨论】:

    猜你喜欢
    • 2011-09-05
    • 2011-10-18
    • 1970-01-01
    • 2019-05-04
    • 1970-01-01
    • 1970-01-01
    • 2011-02-03
    • 2014-11-15
    相关资源
    最近更新 更多