【问题标题】:Forcing the loading of image data represented by a Java Image object强制加载由 Java Image 对象表示的图像数据
【发布时间】: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


【解决方案1】:

有一堂精彩的课

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

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

【讨论】:

  • 后人注意: The constructor of MediaTracker 需要对 Component 的非空引用,但您不需要“插入”实际的 GUI 对象实例:如果您只是创建一个普通的new Container() 并将其传递给构造函数new MediaTracker(new Container()),则可以以独立方式使用新实例。
【解决方案2】:

使用Toolkit#get/createImagejava.awt.Image 使用后台线程来加载图像,您可以使用ImageObserver(通过MediaTracker)来监控图像的加载状态,或者您可以只使用ImageIO.read,它会加载完全返回之前的图像

详情请见Reading/Loading an image

【讨论】:

  • 由于这个问题没有被否决,也没有添加新的接近投票,我可以假设这个问题没有任何问题。它在哪些方面不回答问题?在哪些方面可以改进?由于没有提供新的答案,我可以假设您对如何解决问题没有更好的想法,这引出了您如何知道它不起作用的问题?由于没有其他答案被投反对票,我只能假设您对我帮助他人有个人问题
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-03-02
  • 1970-01-01
  • 1970-01-01
  • 2021-07-20
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多