Разница между Image и BufferedImage в Java

В чем разница между Image и BufferedImage?

Можно ли создать BufferedImage непосредственно из источника изображения "image.png"?

Ответы

Ответ 1

Если вы знакомы с Java util.List, разница между Image и BufferedImage совпадает с разницей между List и LinkedList.

Изображение представляет собой общую концепцию, а BufferedImage - это конкретная реализация общей концепции; вроде как BMW - это марка автомобиля.

Ответ 2

Изображение представляет собой абстрактный класс. Вы не можете напрямую копировать изображение. BufferedImage является потомком, и вы можете создать экземпляр этого. Итак, если вы понимаете абстрактные классы и наследование, вы поймете, когда использовать их.

Например, если вы использовали более одного потомка изображений, они собираются совместно использовать некоторые общие свойства, которые унаследованы от изображения.

Если вы хотите написать функцию, которая будет использовать любой вид потомка в качестве параметра, вы можете сделать что-то вроде этого:

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

Затем вы можете вызвать функцию, передав ей BufferedImage или VolatileImage.

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

Вы не будете преобразовывать изображение в BufferedImage, потому что у вас никогда не будет изображения.

Ответ 3

В чем разница между Image и BufferedImage?

Как указано в учебнике Oracle Java для работы с изображениями

  • Класс java.awt.Image - это суперкласс, который представляет графические изображения в виде прямоугольных массивов пикселей.
  • Класс java.awt.image.BufferedImage, который расширяет класс Image, чтобы приложение могло напрямую работать с данными изображения (например, извлечение или настройка цвета пикселя). Приложения могут напрямую создавать экземпляры этого класса.

Класс BufferedImage является краеугольным камнем API визуализации немедленного режима Java 2D. Он управляет изображением в памяти и предоставляет методы для хранения, интерпретации и получения данных пикселей. Поскольку BufferedImage является подклассом Image, он может быть визуализирован с помощью методов Graphics и Graphics2D, которые принимают параметр Image.

BufferedImage - это по существу изображение с доступным буфером данных. Поэтому более эффективно работать непосредственно с BufferedImage. У BufferedImage есть ColorModel и Растр данных изображения. ColorModel обеспечивает цветную интерпретацию данных пикселя изображения.


Можно ли создать BufferedImage непосредственно из источника изображения "image.png"?

Конечно.

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