我在游戏教程中读到了如何加载图片,他们这样做了:
public Image loadImage(... String ref ...) {
...
URL url = this.getClass().getClassLoader().getResource(ref);
BufferedImage source = ImageIO.read(url);
GraphicsConfiguration gc = GraphicsEnvironment.getLocalGraphicsEnvironment().getDefaultScreenDevice().getDefaultConfiguration();
Image image = gc.createCompatibleImage(source.getWidth(), source.getHeight(), Transparency.BITMASK);
image.getGraphics().drawImage(source, 0, 0, null);
return image;
}
这绝对不是可用性和清晰度方面的最佳方式(=没有人能够通过使用健康的大脑来找到这种方式)。为什么这么复杂?它必须是吗?为什么图像加载不能那样简单:
BufferedImage image = ImageIO.read(ref);
如果你只是想以一种Java自动执行它必须做的所有默认“东西”的方式加载图像,是否有更简单的方法?可能有一个原因是该代码的作者选择了另一种方式,因为他想要实现一些非默认行为?在写答案时,请理解我正在寻找一种简单的方法来解决图像加载的问题,以及在需要时应用更复杂方法的能力和理解。
修改
这两个答案都是他们各自作者的最佳表现,直到现在我还不能accept
一个答案,因为没有答案显示更简单的方法和/或解释究竟发生了什么。
答案 0 :(得分:4)
嗯,这里发生了很多事情。打开URL,将URL内容加载到缓冲区中。图像从缓冲区加载。它被转换为设备兼容的位图。
我认为完成这一切的4行代码非常棒。我不想听起来很旧,但是当我想在DOS中使用Ye Olde C ++绘制位图时,我首先必须访问该库以获取有关各种位图格式的书,然后编写大约10,000行代码以仅支持其中一些......然后我在本地计算机上得到了一个位图(这是最简单的图像)。没有jpg,没有网络,更不用说互联网了,当然也没有跨平台。
如果您需要从互联网上加载大量图片,请随意将其放入功能中,就像您在此处所做的那样。对我来说,这些完全不相关的功能在默认情况下不会归为一个声明,这似乎并不奇怪。
答案 1 :(得分:2)
为什么图像加载不能像那样容易:
BufferedImage image = ImageIO.read(ref);
实际上,“加载图片” IS 很容易。
GolezTrol完全正确: IS 在这里发生了很多事情:
上述代码动态获取对需要加载的图形的引用。您可以轻松传递文件名,URL地址或Java文件参考(以及许多其他可能性)。
后续代码获取对图形环境的引用以显示图形。如果你在GUI组件的“OnPaint()”方法中调用了“drawImage()”,那么所有这些工作都已经完成了。
能够解码几乎任何图形文件,并能够在几乎任何图形环境中显示它,只需一行 IS 非常棒!
混合''匹配的东西来自于什么东西,你如何使用它以及它随意去哪里同样很棒。
... IMHO
答案 2 :(得分:1)
我用Google搜索了一下,我想我找到了你问题的答案。针对给定设备的BufferedImage的优化支持Game Tutorial加载图像的方式,具体取决于设备颜色深度,设备分辨率和颜色模型。使用此版本的代码还有另一个原因,即在早期版本的Java中缓存图像。在早期版本中,JVM会在加载时将图像标记为托管(启用硬件加速),如教程所述,如果使用ImageIO.read(..)加载它,则不会将其标记为托管。您可以在此post中查看完整说明。希望这会有所帮助。