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
}
}
}
我正在 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:
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
}
}
}