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 图标图像最大文件大小的主要内容,如果未能解决你的问题,请参考以下文章