强制加载由Java Image对象表示的图像数据

时间:2017-02-22 11:31:55

标签: java image awt bufferedimage

使用对类型为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实例的数据是否相同。因此,在进行逐像素检查之前,最简单地确保每个图像都被加载是最容易的。

1 个答案:

答案 0 :(得分:2)

有一个很棒的课程

MediaTracker mt=new MediaTracker(this);
mt.addImage(image, 0);
try {
  mt.waitForID(0);
}
catch (InterruptedException me) { System.out.println("error); }

然后您可以使用MediaTracker.html中的任何错误方法来检查可能的错误/错误加载。