Spec-Zone .ru
спецификации, руководства, описания, API
|
СОДЕРЖАНИЕ | ПРЕДЫДУЩИЙ | NEXT |
ImageReader
ImageIO
класс, чтобы выполнить всю работу декодирования, приложение может использовать ImageIO
класс, чтобы получить ImageReader
объект, который может использоваться, чтобы выполнить чтение: Iterator readers = ImageIO.getImageReadersByFormatName("gif"); ImageReader reader = (ImageReader)readers.next();Читатели могут также быть получены основанные на содержании файла, суффиксе файла, или типе MIME. Механизм для определения местоположения и инстанцирования читателя использует
javax.imageio.spi.ImageReaderSpi
класс, который позволяет информации о плагине читателя быть полученной, фактически не инстанцируя плагина. Понятие "интерфейсов поставщика услуг" (SPI) описывается подробно в следующей главе. Как только читатель был получен, это должно быть предоставлено входным источником. Большинство читателей в состоянии читать из ImageInputStream
, который является специальным входным источником, который определяется API ввода-вывода Изображения. Специальный входной источник используется, чтобы сделать его простым для читателя и писателей, чтобы работать и с файлом и с вводом-выводом потоковой передачи.
Получение ImageInputStream
является прямым. Учитывая входной источник в форме a File
или InputStream
, ImageInputStream
производится вызовом:
Object source; // File or InputStream ImageInputStream iis = ImageIO.createImageInputStream(source);Как только источник был получен, он может быть присоединен к читателю, вызывая
reader.setInput(iis, true);Вторые параметры должны быть установлены ко лжи, если исходный файл содержит повторные изображения, и приложение, как гарантируют, не считает их в порядке. Для форматов файлов, которые позволяют только единственному изображению быть сохраненным в файле, всегда законно передать в значении истины.
Как только читателю установили его входной источник, мы можем использовать это, чтобы получить информацию об изображении, обязательно не заставляя данные изображения быть считанными в память. Например, вызов reader.getImageWidth(0)
позволяет нам получать ширину первого изображения, сохраненного в файле. Правильно написанный плагин попытается декодировать только так много файла, как необходимо, чтобы определить ширину изображения, не читая пикселей.
Чтобы считать изображение, приложение может вызвать reader.read(imageIndex)
, где imageIndex
индекс изображения в пределах файла. Это приводит к тому же самому результату, как будто он вызвал ImageIO.read
, как показано выше.
ImageReadParam
read
метод с дополнительным параметром типа ImageReadParam
. ImageReadParam
позволяет приложению определять целевое изображение, в котором должны храниться декодируемые данные изображения, позволяя лучше управляет по использованию памяти. Это также позволяет области интереса быть определенной, так же как факторы подвыборки, которые могут использоваться, чтобы получить упрощенную версию изображения. Когда исходная область будет установлена, плагин читателя попытается декодировать только требуемую область, до такой степени, что формат файла позволяет частичное декодирование. В любом случае никакие пиксели вне области не появятся в выводе. Эта возможность позволяет работать с чрезвычайно большими изображениями в ограниченном объеме памяти.
Например, чтобы декодировать только верхний левый квадрант изображения, приложение сначала получает ImageReadParam
это является подходящим для использования с читателем:
ImageReadParam param = reader.getDefaultReadParam();Затем, исходная область интереса устанавливается на
ImageReadParam
: import java.awt.Rectangle; int imageIndex = 0; int half_width = reader.getImageWidth(imageIndex)/2; int half_height = reader.getImageHeight(imageIndex)/2; Rectangle rect = new Rectangle(0, 0, half_width, half_height); param.setSourceRegion(rect);Наконец, изображение читается, используя
ImageReadParam
: BufferedImage bi = reader.read(imageIndex, param);Результатом является новое
BufferedImage
чья ширина и высота равны половине таковых из исходного изображения (округляющий в меньшую сторону, если у изображения были нечетная ширина или высота). Нижний правый квадрант изображения может тогда быть считан в то же самое BufferedImage
это создавалось, чтобы содержать верхний левый квадрант, перезаписывая предыдущие пиксельные данные:
param.setDestination(bi); rect = new Rectangle(half_width, half_height, half_width, half_height); param.setSourceRegion(rect); BufferedImage bi2 = reader.read(0, param); if (bi == bi2) { System.out.println("The same BufferedImage was used!"); } else { System.out.println("This can't happen!"); }Практически, приложение могло просто вызвать
reader.read(0, param)
не присваивая результат где угодно, зная, что пиксели будут записаны в существующее BufferedImage
bi
. Как другой пример, чтобы считать каждый третий пиксель изображения, приводящего к одной девятой изображения, размер исходных, факторов подвыборки может быть установлен в ImageReadParam
:
param = reader.getDefaultImageParam(); param.setSourceSubsampling(3, 3, 0, 0); BufferedImage bi3 = reader.read(0, param);
IIOParamController
IIOParamController
объект, который может использоваться, чтобы установить IIOReadParam
(или IIOWriteParam
) использование графического интерфейса пользователя (GUI), или любой другой интерфейс. Плагин читателя может присоединить IIOParamController
любому ImageReadParam
объекты, которые это создает: ImageReadParam param = reader.getDefaultImageParam(); IIOParamController controller = param.getController(); if (controller != null) { controller.activate(param); }Когда контроллер
activate
метод вызывают, он выводит на экран GUI и обрабатывает пользовательские события, такие как перемещения ползунка и нажатия кнопки. Обычно интерфейс будет содержать кнопку "OK" или "Apply", которая когда нажато заставит активировать метод возвращаться. Контроллер ответственен за вызов методов на его связанном ImageReadParam
обновить его состояние, или в ответ на каждое событие GUI, или внезапно до возврата из activate
.ImageReader
класс, которые имеют дело с изображениями, берет imageIndex
параметр. Этот параметр предоставляет доступ к любому из изображений в мультифайле образа. ImageReader.getNumImages
метод возвращает число изображений, которые сохранены во входном файле. Этот метод берет булев параметр, allowSearch
. Некоторые форматы изображения, особенно ДЖИФ, не обеспечивают способа определить число изображений, не читая весь файл. Так как это может быть дорогостоящим, устанавливая allowSearch
к false
позволит читателю возвращать значение -1
вместо фактического числа изображений. Если параметр true
, читатель будет всегда возвращать фактическое число изображений.
Даже если число изображений не известно приложением, все еще возможно вызвать read(imageIndex)
; если индекс будет слишком большим, то метод бросит IndexOutOfBoundsException
. Таким образом приложение может запросить изображения с увеличивающимися индексами, пока оно не получает исключение.
Приложения могут определить, сколько изображений миниатюры, связанных с определенным изображением, доступно, вызывая:
reader.getNumThumbnails(imageIndex);Если изображение миниатюры присутствует, оно может быть получено, вызывая:
int thumbailIndex = 0; BufferedImage bi; bi = reader.readThumbnail(imageIndex, thumbnailIndex);