【发布时间】:2017-07-12 10:07:10
【问题描述】:
有没有办法使用对Image 类型实例的引用来强制加载相应图像的数据,例如Image.getWidth(ImageObserver) 返回有效数据? ——例如:
Image image = getImageFromSomewhereElse();
image.load(); // This method doesn't exist but it would be wonderful if it did
Image otherImage = getImageFromYetAnotherPlace();
otherImage.load();
// "compareImages" from <https://stackoverflow.com/a/29886786/1391325>
// "toBufferedImage" from <https://stackoverflow.com/a/13605411/1391325>
if (compareImages(toBufferedImage(image), toBufferedImage(otherImage))){
System.out.println("Yay! Images are the same!");
}
背景
在现有的应用程序中,我现在需要测试对Image 对象的两个引用是否实际上是“相同”的图片(但是可以做到最好):为了做到这一点,我正在尝试这样做an answer to a related question 中建议的逐像素比较。但是,为了使用提供的解决方案执行此操作,我需要将我已经获得的 Image 实例转换为 BufferedImage 实例,例如通过构造一个新的BufferedImage,然后按照another post 中的建议将另一个图像的数据绘制到它上面。但是,与发布到链接答案的评论相对应,在我的情况下这是不可能的,因为相关图像尚未加载:
...
原因:java.lang.IllegalArgumentException:宽度(-1)和高度(-1)不能
在 java.awt.image.DirectColorModel.createCompatibleWritableRaster(DirectColorModel.java:1016)
java.awt.image.BufferedImage.(BufferedImage.java:333)
...
不幸的是,创建 Image 实例的代码非常复杂,所以我不愿意开始重构,例如而是检查用于创建 Image 实例的数据是否相同。因此,最简单的方法是在逐像素检查之前以某种方式简单地确保每个图像都已加载。
【问题讨论】:
-
要么在加载中添加
ImageObserver,要么使用ImageIO.read(..)之类的阻塞方法来确保图像完全加载。 -
这个问题的重点是我没有
URL/File/InputStream/etc。Image实例是为创建的。 -
哎呀..
ImageObserver我的意思是MediaTracker。 :P
标签: java image awt bufferedimage