Иллюстрированный самоучитель по Java
Модель
обработки прямым доступом
Подобно тому, как вместо класса
Graphics система Java 2D использует его расширение Graphics2D, описанное в
главе
9,
вместо класса image в Java 2D употребляется его расширение — класс Bufferedimage.
В конструкторе этого класса
Bufferedlmage(int width,
int height, int imageType)
задаются размеры изображения и способ
хранения точек — одна из констант:
TYPE_INT_RGB
TYPE_4BYTE_ABRG TYPE_USHORT_565_RGB
TYPE_INT_ARGB
TYPE_4BYTE_ABRG_PRE TYPE_USHORT_555_RGB
TYPE_INT_ARGB_PRE
TYPE_BYTE_GRAY TYPE_USHORT_GRAY
TYPE_INT_BRG
TYPE_BYTE_BINARY
TYPE_3BYTE_BRG
TYPE_BYTE_INDEXED
Как видите, каждый пиксел может
занимать 4 байта — INT, 4BYTE, или 2 байта — USHORT, или 1 байт — BYTE. Может
использоваться цветовая модель RGB, или добавлена альфа-составляющая — ARGB,
или задан другой порядок расположения цветовых составляющих — BRG, или заданы
градации серого цвета — GRAY. Каждая составляющая цвета может занимать один
байт, 5 битов или 6 битов.
Экземпляры класса Bufferedimage
редко создаются конструкторами. Для их создания чаще обращаются к методам createimage
() класса component с простым приведением типа:
Bufferedimage bi = (Bufferedlmage)createimage(width,
height)
При этом экземпляр bi получает характеристики
компонента: цвет фона и цвет рисования, способ хранения точек.
Расположение точек в изображении
регулируется классом Raster или его подклассом WritabieRaster. Эти классы задают
систему координат изображения, предоставляют доступ к отдельным пикселам методами
getPixeio, позволяют выделять фрагменты изображения методами getPixeiso. Класс
WritabieRaster дополнительно разрешает изменять отдельные пикселы методами setPixei
() или целые фрагменты изображения методами setPixels () и setRect().
Начало системы координат изображения
— левый верхний угол — имеет координаты (minx, minY), не обязательно равные
нулю.
При создании экземпляра класса Bufferedimage
автоматически формируется связанный с ним экземпляр класса WritabieRaster.
Точки изображения хранятся в скрытом
буффе, содержащем одномерный или двумерный массив точек. Вся работа с буфером
осуществляется методами одного из классов DataBufferByte, DataBufferlnt, DataBufferShort,
DataBufferushort в зависимости от длины данных. Общие свойства этих классов
собраны в их абстрактном суперклассе DataBuffer. В нем определены типы данных,
хранящихся в буфере:
TYPE_BYTE, TYPEJJSHORT, TYPE_INT, TYPEJJNDEFINED.
Методы класса DataBuffer предоставляют
прямой доступ к данным буфера, но удобнее и безопаснее обращаться к ним методами
классов Raster и WritableRaster.
При создании экземпляра класса Raster
или класса WritableRaster создается экземпляр соответствующего подкласса класса
DataBuffer.
Чтобы отвлечься от способа хранения
точек изображения, Raster может обращаться не к буферу DataBuffer, а к подклассам
абстрактного класса SampieModei, рассматривающим не отдельные байты буфера,
а составляющие (samples) цвета. В модели RGB — это красная, зеленая и синяя
составляющие. В пакете java.awt. image есть пять подклассов класса SampieModei:
-
componentsampieModel
— каждая составляющая цвета хранится в отдельном элементе массива DataBuffer;
-
BandedSampleModel
— данные хранятся по составляющим, составляющие одного цвета хранятся обычно
в одном массиве, a
DataBuffer
содержит двумерный массив:
по массиву для каждой составляющей; данный класс расширяет класс
ComponentsampieModel
;
-
PixelInterleavedSampieModel
— все составляющие цвета одного пиксела хранятся в соседних элементах единственного
массива
DataBuffer
; данный Класс расширяет класс
ComponentsampieModel
;
-
MultiPixeiPackedSampieModel
— цвет каждого пиксела содержит только одну составляющую, которая может быть
упакована в один элемент массива
DataBuffer
;
-
singiePixelPackedSampleModel
— все составляющие цвета каждого пиксела хранятся в одном элементе массива
DataBuffer
.
На рис. 15.5 представлена иерархия
классов Java 2D, реализующая модель прямого доступа.
Итак, Java 2D создает сложную и
разветвленную трехслойную систему
DataBuffer
—
SampieModei
—
Raster
управления данными изображения
Bufferedimage
. Вы можете манипулировать точками изображения,
используя их координаты в методах классов
Raster
или
спуститься на уровень ниже и обращаться к составляющим цвета пиксела методами
классов
SampieModei
. Если же вам надо работать с отдельными
байтами, воспользуйтесь классами
DataBuffer
.
Рис. 15.5.
Классы, реализующие модель прямого доступа
Применять эту систему приходится
редко, только при создании своего способа преобразования изображения. Стандартные
же преобразования выполняются очень просто.