使用对类型为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:Width(-1)和height(-1)不能是&lt; = 0
at java.awt.image.DirectColorModel.createCompatibleWritableRaster(DirectColorModel.java:1016)
java.awt.image.BufferedImage中。(BufferedImage.java:333)
...
不幸的是,创建Image
实例的代码非常复杂,所以我不愿意开始重构以便例如而是检查用于创建Image
实例的数据是否相同。因此,在进行逐像素检查之前,最简单地确保每个图像都被加载是最容易的。
答案 0 :(得分:2)
有一个很棒的课程
MediaTracker mt=new MediaTracker(this);
mt.addImage(image, 0);
try {
mt.waitForID(0);
}
catch (InterruptedException me) { System.out.println("error); }
然后您可以使用MediaTracker.html中的任何错误方法来检查可能的错误/错误加载。