Java работа с изображением

Изображения в Java

Для работы с изображениями в Java используют классы java.awt.Image и его наследника java.awt.image.BufferedImage.

При загрузке изображений в Java делается перевод формата изображения во внутренний формат. Встроенные возможности поддерживают преобразование во внутренний формат из jpeg, gif, png, bmp, wbmp. Пример загрузки изображения Flor.jpg размерами 350 х 263:

В методе paint выводим изображение от точки x = 0, y = 0:

Получаем:

Другой пример: уменьшим изображение в размерах до 250 х 188 и выведем от точки x = 10, y = 10:

Получаем:

Здесь мы вывели изображение от точки 10; 10. Аргумент 260 – это сумма ширины картинки 250 и координаты по оси Х, т.е. 260 = 250 + 10. Аналогично 198 – это высота, полученная как сумма высоты картики 188 и координаты по Y, т.е. 198 = 188 + 10.

С помощью фильтра можно изменить интенсивность изображения:

Получаем:

art = getImage(getDocumentBase(), getParameter("img"));

public void paint(Graphics g) <

g.drawImage(art, 0, 0, this);

Метод paint использует drawlmage с четырьмя аргументами: это ссылка на изображение art, координаты левого верхнего угла рисунка х, у и объект типа ImageObserver. Мы поговорим подробнее об ImageObserver в следующем параграфе; здесь мы использовали this в качестве имени ImageObserver, поскольку он встроен в апплет. Когда этот апплет запускается, он в методе init начинает загрузку art. Процесс загрузки изображения по сети хорошо заметен – SimpleImageLoad.html , поскольку встроенный интерфейс ImageObserver вызывает процедуру paint при каждом поступлении новой порции данных из сети. Вы можете использовать ImageObserver для отслеживания загрузки изображения, а в это время выводить на экран другую информацию.

ImageObserver — это абстрактный интерфейс, используемый для получения сообщения о создании изображения, Метод imageUpdate из ImageObserver — это все, что вы должны реализовать в своем апплете для его использования. В то время, как вы получаете информацию о загрузке, вы можете показывать любую понравившуюся вам мультипликацию, индикатор степени завершения загрузки или любую другую заставку. Для использования ImageObserver в своем подклассе Applet вы должны добавить в него строку implement Image O bserver, как показано в этом фрагменте программы:

Читайте также:  Водонагреватели атлантик с сухим теном отзывы

public class MyApplet extends Applet implement ImageObserver <

Затем вам придется вставить в свой класс метод imageUpdate для интерфейса ImageObserver, как показано в следующем фрагменте :

public boolean imageUpdate(Image img, int status,

int x, int у int width, int height) <

if((status & ALLBITS) != 1) <

System.out.println("Still processing the image");

System.out.println("Done processing the image");

Метод imageUpdate вызывается с изображением Image, которое находится в процессе изменения, целым параметром status, отражающим состояние изменения, и с координатами прямоугольника (x, у, width, height), которые соответствуют различным величинам в зависимости от информационных флагов, перечисленных ниже. ImageUpdate должен возвращать false по окончании загрузки изображения и true — если изображение еще обрабатывается.

Целая переменная status поразрядно проверяется на наличие одного или нескольких флагов. Возможные флаги и информация, которую они несут, перечислены ниже:

WIDTH

Ширина изображения доступна и может быть взята из аргумента width.

HEIGHT

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

PROPERTIES

Свойства изображения теперь доступны. Вы можете получить их посредством art.properties.

SOMEBITS

Доступны пиксели, необходимые для рисования масштабированного варианта изображения. Область, содержащая новые пиксели, задается параметрами x, у, width и height.

FRAMEBITS

Еще один кадр ранее нарисованного изображения с несколькими кадрами, готов для перерисовки. Параметры x, у, width, height не содержат информации.

ALLBITS

Обработка перерисовываемого изображения окончена, и оно может быть отрисовано в конечном виде. Значения аргументов x, у, width и height не содержат значимой информации.

ERROR

При пересылке изображения возникла ошибка. Поступление дальнейшей информации стало невозможным и рисование прервано. Для удобства выставляется и флаг ABORT для индикации прерывания загрузки изображения.

ABORT

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

Читайте также:  Внешняя обработка поиск и замена значений

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

public class ObservedImageLoad extends Applet

implements Runnable, ImageObserver <

public void init() <

art = getImage(getDocumentBase(), getParameter("img"));

public void paint(Graphics g) <

loaded = g.drawImage(art, 0, 0, this);

public boolean imageUpdate(Image img, int info,

int x, int y, int width, int height) <

if((info & ALLBITS) != 1) <

Метод imageUpdate обрабатывает статус загрузки изображения. Информация о статусе передается через переменную info, с которой сравнивается статическая переменная ALLBITS. Если еще не получено все изображение, то мы добавляем величину heihgt к общему числу обработанных строк изображения. Для проверки этой концепции мы выводим количество обработанных строк изображения на консоль. Метод run перерисовывает апплет пять раз в секунду (каждые 200 миллисекунд) до тех пор, пока изображение art не загрузится. То, как долго монитор статуса загрузки будет работать, зависит от скорости передачи данных изображения по сети – ObservedImageLoad.html .

MediaTracker — это класс, предоставляющий удобный интерфейс для контроля статуса нескольких изображений. В следующих версиях этот класс будет контролировать другие мультимедийные форматы, такие, как звуковые файлы. Для использования MediaTracker нужно создать новый объект этого класса и использовать метод addImag e для контроля статуса загрузки. Используйте MediaTracker при загрузке группы изображений. Пока все изображения, которые вас интересуют, не загружены, пользователя будет развлекать демонстрационный экран.

ImageProducer — это абстрактный интерфейс для объектов, которые готовят данные для Image. Объект, который реализует интерфейс ImageProducer, должен предоставлять массивы целых или байтовых переменных, представляющих собой данные изображений. Давайте познакомимся с очень полезным классом MemoryImageSource, реализующий ImageProducer. Мы создадим новый объект Image из данных, которые сгенерировал ImageProducer.

MemoryImageSource — класс, используемый для создания нового изображения из массива пикселей. Вот конструктор, используемый для создания объекта MemoryImageSource:

MemoryImageSource(int width, int height, int pixel[], int offset, int scanLineWidth)

Объект MemoryImageSource собирается из массива целых величин pixel[] в используемой по умолчанию модели цветов RGB для генерации данных объекта Image. В используемой по умолчанию цветовой модели пиксель — это целая величина состоящая из Alpha, Red, Green и Blue (OxAARRGGBB). Величина Alpha обозначает степень прозрачности элемента изображения.

Читайте также:  Забыл пароль на мейзу как сбросить настройки

Вывод графических изображений Java

Здравствуйте дорогие читатели блога! Вы наверное уже видели, как путем вывода линий и фигур создаются простые изображения. Сложные изображения, такие как фотографии, обычно создаются отдельно, например, в результате сканирования или применения графических редакторов. Также можно создать изображения и помещать набор пикселей в массив. Эта процедура широко применяется при генерировании фрактальных изображений.

Если изображение хранятся в файлах на диске компьютера или в глобальной сети, их можно прочитать, а затем отобразить на экране с помощью объекта класса Graphics. Начиная с Java SE 1.5, организовать чтение изображений очень легко. Если рисунок хранится в локальном файле, достаточно использовать следующий фрагмент кода:

При вызове метода можно также указать URL:

Если рисунок не доступен, метод read() генерирует исключение IOException. Пока будем считать, что наша простая программа перехватывает исключение и выводит на экран содержимое стека.

Теперь переменная image содержит ссылку на объект, инкапсулирующий графическое изображение. Этот объект можно отобразить на экране с помощью метода drawImage() класса Graphics.

Программа, приведенная в конце урока, делает немного больше, многократно отображая указанное изображение. Результат работы программы показан на рис.1. Вывод осуществляется с помощью метода paintComponent(). Сначала одна копия рисунка помещается в левый верхний угол окна, а затем вызывается метод copyArea(), который копирует его.

Ниже приведен полный исходный код программы для работы с изображениями:

Не забудьте добавить мячик ball.png в папку src. Без изображении мячика, прогармма не будет работать.

3 комментария to “Вывод графических изображений Java”

  1. MrM Says:
    Январь 25th, 2018 at 13:40

Не рабочий пример…

Ан нет, просто много невидимой шняги копипастом вставилось.

Собираюсь на этой неделе по делам поехать в Челябинск.
Скажите кто знает об городе.
Где можно поселиться? Куда сходить?
Может подскажите где посмотреть подробную информацию?