Spec-Zone .ru
спецификации, руководства, описания, API
Содержание документации
СОДЕРЖАНИЕ | ПРЕДЫДУЩИЙ | NEXT

3.3 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, как показано выше.


3.3.1 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);


3.3.2 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.

3.3.3 Чтение От Мультифайлов образа

Все методы в ImageReader класс, которые имеют дело с изображениями, берет imageIndex параметр. Этот параметр предоставляет доступ к любому из изображений в мультифайле образа.

ImageReader.getNumImages метод возвращает число изображений, которые сохранены во входном файле. Этот метод берет булев параметр, allowSearch. Некоторые форматы изображения, особенно ДЖИФ, не обеспечивают способа определить число изображений, не читая весь файл. Так как это может быть дорогостоящим, устанавливая allowSearch к false позволит читателю возвращать значение -1 вместо фактического числа изображений. Если параметр true, читатель будет всегда возвращать фактическое число изображений.

Даже если число изображений не известно приложением, все еще возможно вызвать read(imageIndex); если индекс будет слишком большим, то метод бросит IndexOutOfBoundsException. Таким образом приложение может запросить изображения с увеличивающимися индексами, пока оно не получает исключение.


3.3.4 Чтение Изображений "Миниатюры"

Некоторые форматы изображения позволяют маленькому изображению предварительного просмотра (или многократные предварительные просмотры) быть сохраненным рядом с основным изображением. Эти изображения "миниатюры" полезны для идентификации файлов образа быстро без потребности декодировать все изображение.

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

reader.getNumThumbnails(imageIndex);
Если изображение миниатюры присутствует, оно может быть получено, вызывая:
int thumbailIndex = 0;
BufferedImage bi;
bi = reader.readThumbnail(imageIndex, thumbnailIndex);


СОДЕРЖАНИЕ | ПРЕДЫДУЩИЙ | NEXT

Oracle и/или его филиалы Авторское право © 1993, 2011, Oracle и/или его филиалы. Все права защищены.
Свяжитесь с Нами