如何在不初始化的情况下将图像转换为BufferedImage?

4

我想知道是否有一种方法可以将图像转换为BufferedImage,而不需要像a那样的代码。

new BufferedImage(...)

因为每次新的初始化都会使应用程序变慢,而且如果它在paint()方法中出现就更糟糕了 :(
请建议最优化的转换方式。
谢谢
3个回答

6
不行,除非原始的Image已经是BufferedImage。那么你可以直接进行强制类型转换:
BufferedImage bufImg = null;
if (origImage instanceof BufferedImage) {
    bufImg = (BufferedImage) origImage;
else {
    bugImg = new BufferedImage(...);
    // proper initialization
}

如果它不是一个BufferedImage,那么它很可能是另一个API中的具体子类VolatileImage
根据volatile image文档:

volatile image是一种图像,由于应用程序无法控制的情况(例如由操作系统或其他应用程序引起的情况)而随时可能丢失其内容。

正如您所了解的那样,这种图像无法提供与BufferedImage相同的接口,因此获取BufferedImage的唯一方法是创建一个并在其上绘制原始图像。

我的意思是 java.awt.Image 这个图像 :) 哦... 那么我需要在这里想出一些东西,因为使用新的 BufferedImage 重新绘制太慢了 :( 有没有什么方法可以解决这个问题? - user592704
@user592704:java.awt.Image是一个抽象类,所以虽然你的图像是一个Image对象,但它也是Image的具体子类之一的实例,就像aioobe在上面所述的那样。 - Hovercraft Full Of Eels
但是VolatileImage效果怎么样呢? - user592704

6

因为每个新的初始化都会使应用程序运行变慢

缓存一个BufferedImage,只有在所需大小发生变化时才创建新的图像。否则清除当前实例的Graphics对象并进行任何需要的新绘制。


+1:如果在普通的Java GUI应用程序中一直创建新的BufferedImage,那么你几乎肯定正在做一些非常次优的事情。 - mikera
我需要在每次调整 BufferedImage 大小时创建新的 init 吗? - user592704
那么每次比例尺变化时,都需要重新初始化 BufferedImage 吗? - user592704
“规模”是什么?请注意,可以在绘制图像时很容易地进行缩放(裁剪、旋转等)。 - Andrew Thompson
1
由于这是本线程中首次提到JLabelImageIcon,我认为现在是时候添加了。为了更快地获得帮助,请发布一个SSCCE。对于需要图像的SSCCE,可以在代码中生成它们,或者热链接到网络上的一些现有图像。以下是一些您可以链接到的示例图像 - Andrew Thompson
显示剩余3条评论

2
有没有一种方法可以使用paint()方法将BufferedImage绘制到JLabel上?
一个方便的方法是实现Icon接口。在这个示例中,Histogram在标签被告知要repaint()时简单地绘制自己。
如果图像的来源需要耗费时间的操作,例如缩放,请像静态工厂GradientImage中所示那样预先渲染图像。

但是现在我不太确定我是否应该... 但也许我应该从一开始就使用BufferedImage,而不是转换任何东西? - user592704
1
一个指导原则是使用最一般的类型,以符合预期的使用。当绘制 BufferedImage 时,您所做的操作是否可以在加载时提前完成? - trashgod
我正在尝试测试alpha合成 :) - user592704
1
啊,你可能会喜欢看看这个AlphaComposite实用程序,它还实现了Icon - trashgod
1
谢谢。非常有用 :) 我会检查所有建议 - user592704
显示剩余4条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接