我正在开发一款关于Java的国际象棋游戏。我一直在将图像导入Eclipse,然后将它们分配给ImageIcons,然后将这些ImageIcons分配到按钮上以形成网格。
在我的四个主教图像中有三个没有被分配到各自的按钮,所以我看了文件大小,结果发现三个图像的大小没有分配大约是1,100KB ,~1,200KB,~40KB。分配给按钮的图像大约为25KB。我认为这很奇怪(特别是因为所有四个图像非常相似)所以我以较低的分辨率(均低于30KB)导出了三个有问题的图像,然后将它们重新导入Eclipse。当我再次运行我的程序时,他们被分配到正确的按钮,一切都顺利运行。
我使用的按钮都是75 x 75像素,每张图像的像素相同(75 x 75),所以我很困惑为什么会这样。我找了与此有关的任何问题,但我找不到任何问题。如果有人能帮助解释为什么这会发生在我身上会非常有帮助,所以我可以在将来避免这个问题。
答案 0 :(得分:1)
我肯定已经将图像加载到ImageIcons和其他组件中的大得多,所以我怀疑你的问题是在Image完全加载之前将Image分配给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);
}
}
答案 1 :(得分:0)
我建议将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
}
}
}