Java 如何在没有初始化的情况下将映像转换为BuffereImage?

Java 如何在没有初始化的情况下将映像转换为BuffereImage?,java,image,swing,user-interface,graphics,Java,Image,Swing,User Interface,Graphics,我想知道是否有一种方法可以将图像转换为BuffereImage,而无需像 new BufferedImage(...) 因为每个新的初始化都会使应用程序运行变慢,而且,如果它在paint()方法中:( 请告知最佳转换方式 谢谢否。除非原始的图像恰好是一个缓冲图像。然后您可以进行一次转换: BufferedImage bufImg = null; if (origImage instanceof BufferedImage) { bufImg = (BufferedImage) orig

我想知道是否有一种方法可以将图像转换为BuffereImage,而无需像

new BufferedImage(...)
因为每个新的初始化都会使应用程序运行变慢,而且,如果它在paint()方法中:(

请告知最佳转换方式


谢谢

否。除非原始的
图像
恰好是一个
缓冲图像
。然后您可以进行一次转换:

BufferedImage bufImg = null;
if (origImage instanceof BufferedImage) {
    bufImg = (BufferedImage) origImage;
else {
    bugImg = new BufferedImage(...);
    // proper initialization
}
如果它不是一个
buffereImage
,它很可能是一个
VolatileImage
(API中的另一个具体子类)

从volatile image上的文档:

VolatileImage是一种映像,由于应用程序无法控制的情况(例如,由操作系统或其他应用程序引起的情况),它可以随时丢失其内容

正如您所理解的,这样的图像不能提供与
缓冲图像
相同的接口,因此获得
缓冲图像
的唯一方法是创建一个,并在其上绘制原始图像

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

缓存一个
buffereImage
,然后仅在所需大小更改时创建新图像。否则,清除当前实例的
Graphics
对象,并执行任何需要的新图形操作

有没有办法用
paint()
方法将
BuffereImage
绘制到
JLabel

一种方便的方法是实现
图标
界面。在这种方法中,当标签被告知要
repaint()
时,只需绘制自己


如果图像源需要一个耗时的操作,如缩放,请按照静态工厂中所示预渲染图像。

我的意思是将此图像作为java.awt.image:)哦。。。因此,我需要在这里找出一些问题,因为使用新BuffereImage重新绘制太慢了:(有什么方法可以绕过它?@user592704:java.awt.Image是一个抽象类,因此,虽然是的,您的图像是一个图像对象,但正如上面aioobe所说,它也是图像的一个具体子对象的实例。但是VolatileImage效果呢?+1:如果您一直在普通java GUI应用程序中创建新的缓冲区图像,那么您就是almost肯定做了一些非常次优的事情EMM…我必须对每个BuffereImage进行新的初始化调整大小?因此每次缩放更改BuffereImage都必须重新设置?什么是“缩放”?注意缩放(裁剪、旋转等)非常容易正在绘制的图像。由于这是此线程中第一次提到
JLabel
ImageIcon
,我认为是时候添加..为了更快地获得更好的帮助,发布一个。对于需要图像的SSCCE,可以在代码中生成它们,或者在网上热链接到一些现有图像。以下是一些示例。谢谢。它非常有用:)但我使用getImage()方法仅从ImageIcon获取图像,因此获取图像没有问题。因此问题不在JLabel中,而是如何将图像转换为BuffereImage,但现在我不太确定我是否应该…但也许我应该从一开始就使用BuffereImage,根本不转换任何内容?一个指导原则是使用最广泛的与预期用途一致的所有类型。在加载时无法提前完成的绘制时,您对
缓冲图像
所做的操作?啊,您可能希望看到此实用程序,它还实现了
图标
。谢谢。它非常有用:)我将检查所有建议