Java 图标图像最大文件大小

Posted

技术标签:

【中文标题】Java 图标图像最大文件大小【英文标题】:Java Icon Image Maximum File Size 【发布时间】: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 的结果吗?显然,这些“相同像素”的图像是使用......非常不同的格式编码的。 【参考方案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); 
     
 

【讨论】:

另见ImageIcon.setImageObserver(ImageObserver)(但我还是更喜欢ImageIO,它会一直阻塞直到图像完全加载)。【参考方案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
        
    

【讨论】:

以上是关于Java 图标图像最大文件大小的主要内容,如果未能解决你的问题,请参考以下文章

减少 Web 的图像文件大小

具有自定义图标大小的 UIButton 图像

文件上传时的最大图像大小

html 文件上传图像具有最大大小和文件限制

画布图像大小调整使文件更大[重复]

删除具有相同文件名的图像,保留最大文件大小的文件