Java中Image和BufferedImage的区别

Image和BufferedImage有什么区别?

我可以直接从图像源“image.png”创建BufferedImage吗?

如果您熟悉Java的util.List,则Image和BufferedImage之间的区别与List和LinkedList之间的区别相同。

Image是一个通用概念,BufferedImage是generics概念的具体实现; 有点像宝马是一辆汽车的制造。

图像是一个抽象类。 您无法直接实例化Image。 BufferedImage是一个后代,你可以实例化那个。 因此,如果您了解抽象类和inheritance,您将了解何时使用它们。

例如,如果您使用多个Image后代,则它们将共享一些从Imageinheritance的公共属性。

如果你想编写一个将任何一种后代作为参数的函数,你可以这样做:

function myFunction(Image myImage) { int i = myImage.getHeight(); ... } 

然后,您可以通过传递BufferedImage或VolatileImage来调用该函数。

 BufferedImage myBufferedImage; VolatileImage myVolatileImage; ... myFunction(myVolatileImage); myFunction(myBufferedImage); 

您不会将图像转换为BufferedImage,因为您永远不会有图像。

ImageBufferedImage什么区别?

如Oracle Java教程中所述,用于处理图像

  • java.awt.Image类是将图形图像表示为矩形像素数组的超类。
  • java.awt.image.BufferedImage类,它扩展了Image类,允许应用程序直接使用图像数据(例如,检索或设置像素颜色)。 应用程序可以直接构造此类的实例。

BufferedImage类是Java 2D立即模式映像API的基石。 它管理内存中的图像,并提供存储,解释和获取像素数据的方法。 由于BufferedImage是Image的子类,因此可以通过接受Image参数的Graphics和Graphics2D方法进行渲染。

BufferedImage本质上是一个具有可访问数据缓冲区的Image。 因此,直接使用BufferedImage更有效。 BufferedImage具有ColorModel和图像数据的栅格。 ColorModel提供图像像素数据的颜色解释。


我可以直接从图像源“image.png”创建BufferedImage吗?

当然。

 BufferedImage img = ImageIO.read(getClass().getResource("/path/to/image"));