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

Работа с изображениями стандартными средствами Java

123456

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

Способ 1. Добавление изображения с помощью JLabel.

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

Чтобы добавить изображение в JLabel существует метод setIcon(Icon image).

Также это можно сделать во время создания объекта JLabel с помощью конструктора JLabel(String text, Icon icon, int horizontalAlignment).

package javapicture1;

import javax.swing.ImageIcon;

import javax.swing.JFrame;

import javax.swing.JLabel;

public class JavaPicture

{

private static JLabel jLabel;

public static void main(String argv)

{

// Создаем новый объект JLabel.

jLabel = new JLabel();

// Выравниваем по горизонтали.

jLabel.setHorizontalAlignment(javax.swing.SwingConstants.LEFT);

// Выравниваем по вертикали

jLabel.setVerticalAlignment(javax.swing.SwingConstants.TOP);

// Указываем путь к изображению.

jLabel.setIcon(new ImageIcon((«D:\\ashesandsnow.jpg»)));

// Текстовая подпись

jLabel.setText(«Ваш комментарий.»);

// Создаем объект главного окна приложения.

JFrame f = new JFrame(«Picture»);

f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

f.add(jLabel);

f.setSize(550,350);

f.setLocation(200,200);

f.setVisible(true);

}

}

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

Способ 2. Добавление изображения с помощью JPanel.

Использование этого способа заключается в создании нового класса (назовем его PicturePanel) в качестве наследника стандартного JPanel. В новом классе реализуется метод setImageFile(File imageFile), который позволяет загрузить изображение из файла и прорисовать его на фоне JPanel.

public void setImageFile(File imageFile)

{

{

if (imageFile == null)

{

originalImage = null;

}

// Читаем файловый поток.

BufferedImage bi = ImageIO.read(imageFile);

originalImage = bi;

}

catch (IOException ex)

{

// В случае ошибки, выводим сообщение.

System.err.println(«Не удалось загрузить изображение!»);

ex.printStackTrace();

}

// Перерисовываем компонент уже с новым загруженным изображением.

repaint();

}

При изменении размера панели, размеры изображения также меняются, таким образом создается эффект «резинового» изображения, которое «подстраивается» под размеры окна.

// Реакция на изменение размеров панели — изменение размера изображения.

private void formComponentResized(java.awt.event.ComponentEvent evt)

{

int w = this.getWidth();

int h = this.getHeight();

if ((originalImage != null) && (w > 0) && (h > 0))

{

image = originalImage.getScaledInstance(w, h, Image.SCALE_DEFAULT);

this.repaint();

}

}

Ниже приведен полный листинг демо-проекта с комментариями.

package javapicture2;

import java.awt.Graphics;

import java.awt.Image;

import java.awt.image.BufferedImage;

import java.io.File;

import java.io.IOException;

import javax.imageio.ImageIO;

import javax.swing.JFrame;

import javax.swing.JLabel;

import javax.swing.JPanel;

public class JavaPicture

{

private static JLabel jLabel;

public static void main(String argv)

{

// Создаем объект класс PicturePanel.

PicturePanel picturePanel = new PicturePanel();

// Загружаем в него изображение.

picturePanel.setImageFile(new File(«D:\\ashesandsnow.jpg»));

// Создаем объект главного окна приложения.

JFrame f = new JFrame(«Picture»);

f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

f.add(picturePanel);

f.setSize(550,350);

f.setLocation(200,200);

f.setVisible(true);

}

}

class PicturePanel extends JPanel

{

// В объекте класса храним 2 изображения: оригинальное и текущее.

// Оригинальное используется для получения текущего в зависимости от размеров

панели.

// Текущее рисуется на панели на панели.

private BufferedImage originalImage = null;

private Image image = null;

public PicturePanel()

{

initComponents();

}

private void initComponents()

{

addComponentListener(new java.awt.event.ComponentAdapter()

{

public void componentResized(java.awt.event.ComponentEvent evt)

{

formComponentResized(evt);

}

});

}

// Реакция на изменение размеров панели — изменение размера изображения.

private void formComponentResized(java.awt.event.ComponentEvent evt)

{

int w = this.getWidth();

int h = this.getHeight();

if ((originalImage != null) && (w > 0) && (h > 0))

{

image = originalImage.getScaledInstance(w, h, Image.SCALE_DEFAULT);

this.repaint();

}

}

@Override

public void paint(Graphics g)

{

super.paint(g);

/ Прорисовка изображения.

if (image != null)

{

g.drawImage(image, 0, 0, null);

}

// Прорисовка компонент.

super.paintChildren(g);

super.paintBorder(g);

}

public BufferedImage getImage()

{

return originalImage;

}

public void setImage(BufferedImage image)

{

this.image = image;

}

public void setImageFile(File imageFile)

{

{

if (imageFile == null)

{

originalImage = null;

}

// Читаем файловый поток.

BufferedImage bi = ImageIO.read(imageFile);

originalImage = bi;

}

catch (IOException ex)

{

// В случае ошибки, выводим сообщение.

System.err.println(«Не удалось загрузить изображение!»);

ex.printStackTrace();

}

// Перерисовываем компонент уже с новым загруженным изображением.

repaint();

}

}

Изменение размеров окна приводит к пропорциональному изменению размеров изображения.

Важным преимуществом приведенного метода является возможность добавлять другие контролы (элементы GUI) на созданный объект PicturePanel, т.е. использовать его в качестве компонента-контейнера, добиваясь тем самым достижения эффекта фонового изображения.

Способ 3. Добавление изображения с помощью класса Image.

Простой способ, который заключается в создании объекта Image, а затем его отрисовку с помощью метода drawImage() объекта типа Graphics в методе paint() объекта типа JFrame.

package javapicture3;

import java.awt.Graphics;

import java.awt.Image;

import javax.swing.JFrame;

public class JavaPicture extends JFrame

{

public static void main(String args)

{

JavaPicture f = new JavaPicture();

f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

f.setSize(460,370);

f.setLocation(200,100);

f.setVisible(true);

}

@Override

public void paint(Graphics gr)

{

super.paint(gr);

Image img = getToolkit().getImage(«D:\\ashesandsnow.png»);

gr.drawImage(img,30,50,this);

}

}

Данный метод хорош тем, что объекты Image можно обрабатывать с помощью фильтров:

• CropImageFilter (int x, int у, int w, int h) — выделяет фрагмент изображения, указанный в приведенном конструкторе;

• RGBimageFilter — позволяет изменять отдельные пикселы; это абстрактный класс, он требует расширения и переопределения своего метода filterRGBO;

• RepдicateScaieFilter (int w, int h) — изменяет размеры изображения на указанные в приведенном конструкторе, дублируя строки и/или столбцы при увеличении размеров или убирая некоторые из них при уменьшении;

• AreaAveragingScaleFilter (int w, int h) — расширение предыдущего класса; использует более сложный алгоритм изменения размеров изображения

Применяются классы-фильтры совместно с классом-поставщиком, реализующим интерфейс ImageProducer — классом FilteredlmageSource. Этот класс преобразует уже готовую продукцию, полученную от другого поставщика producer, используя для преобразования объект filter класса-фильтра imageFilter или его подкласса.

Java работает с наиболее популярными во Всемирной паутинеформатами изображений — JPEG и GIF. JPEG лучше подходит для естественных цветныхизображений, таких, как фотографии, а формат GIF является наилучшими дляграфических эмблем, изображений кнопок, и т.п.

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

Простой загрузчик изображений

Простейший случай — загрузка в страницу одиночного изображения.Вот маленький апплет, выполняющий эту работу:

/* &lt-title&gt-SimpleImageLoad&lt-/title&gt-

*&lt-applet code=»SimpleImageLoad» width=300 height=150&gt-

* &lt-param name=»img» value=»mupk.gif»&gt-

* &lt-/applet&gt-

*/

import java.applet.*-

import java.awt.*-

public class SimpleImageLoad extends Applet {

Image art-

public void init() {

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 ImageObserver, как показано в этомфрагменте программы:

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 &amp- ALLBITS) != 1) {

System.out.println(«Still processing the image»)-

return true-

}

else {

System.out.println(«Done processing the image»)-

return false-

} }

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

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

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

Категория: Обучение Java | Дата: 19.04.13

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *