Электронная библиотека книг Александра Фролова и Григория Фролова.
Shop2You.ru Создайте свой интернет-магазин
Библиотека
Братьев
Фроловых
[Назад]

Библиотека примеров приложений Java

Оглавление
Растровые изображения в аплете

Растровые изображения в автономном приложении
Класс MediaTracker
Класс ImageObserver
Создание изображений
Фильтр RGBImageFilter
Фильтр CropImageFilter
Полупрозрачные изображения
Класс PixelGrabber
Внеэкранное изображение

Назад Вперед

9.9. Применение класса PixelGrabber

С помощью класа PixelGrabber нетрудно преобразовать любой фрагмент изображения класса Image в массив пикселов. Пример аплета, приведенный в этом разделе, выполняет такую операцию, преобразуя все изображение. Далее полученный массив обрабатывается (удаляется красный цвет), а затем на его основе формируется новое изображение.

Исходный текст примера

Архив проекта для Java WorkShop 2.0

Демонстрация
(ваш браузер должен уметь работать с аплетами Java JDK 1.1)

Немного теории

С помощью класса PixelGrabber приложение Java может легко преобразовать изображение класса Image или любой его фрагмент прямоугольной формы в массив пикселов. В дальнейшем такой массив может быть обработан. На основе обработанного массива нетрудно создать новое изображение.

Как пользоваться классом PixelGrabber?

Сначала вам нужно подготовить массив для хранения пикселов достаточного размера, например:

pix = new int[nImageWidth * nImageHeight];

Здесь nImageWidth - ширина изображения в пикселах, а nImageHeight - высота.

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

public PixelGrabber(
  Image img, int x, int y, int w, int h,
  int pix[],int off, int scansize);

Здесь параметр img задает исходное изображение. Параметры x, y, w и h определяют координаты вырезаемой прямоугольной области, на основе которой строится массив пикселов pix.

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

В документации JDK имеется формула, с помощью которой вы можете определить, как пиксел с заданными координатами (i, j), расположенный в области (x, y, w, h) отображается на соответствующий элемент массива pix. Индекс idx данной точки в массиве pix будет равен следующей величине:

idx = (j - y) * scansize + (i - x) + off;

После создания объекта класса PixelGrabber можно выполнить заполнение массива, для чего следует вызвать метод grabPixels:

try
{
  pgr.grabPixels();  
}
catch(InterruptedException ie)
{
}

Заметим, что этот метод может создавать исключения InterruptedException.

Описание примера

Наш аплет показывает в своем окне изображение, лишенное всех оттенков красного цвета (рис. 1).

pic1.gif (20209 bytes)

Рис. 1. В окне аплета показывается обработанное изображение

Исходное изображение представлено на рис. 2.

pic2.gif (22987 bytes)

Рис. 2. Исходное изображение до обработки

Рассмотрим исходный текст аплета.

Главный класс аплета

В главном классе аплета PixGrabberDemo мы определили поле img класса Image и несколько методов:

import java.awt.*;
import java.applet.*;
import java.awt.image.*;

public class PixGrabberDemo extends Applet
{
  Image img;
  . . .
}

В процессе инициализации поле img хранит ссылку на исходное изображение. После завершения инициализации в это поле записывается ссылка на обработанное изображение.

Метод init

Работа метода init заключается в загрузке исходного изображения и его последующем преобразовании.

Загрузка выполняется обычным образом с применением метода getImage:

img = getImage(getCodeBase(), "img1.jpg");

Чтобы дождаться завершения загрузки, мы используем класс MediaTracker:

MediaTracker mt = new MediaTracker(this);
mt.addImage(img, 0);  
try
{
  mt.waitForAll();
}
catch(InterruptedException ie)
{
  return;
}

Что же касается преобразования, то оно выполняется методом dropRed, определенным в нашем приложении:

img = dropRed(img);
Метод dropRed

Метод dropRed получает в качестве параметра ссылку на исходное изображение, а возвращает результат преобразования:

Image dropRed(Image img)
{
  Image imgNew = null;
  . . .
  return imgNew;
}

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

int[] pix;
    
int nImageWidth = img.getWidth(null);
int nImageHeight = img.getHeight(null);
    
pix = new int[nImageWidth * nImageHeight];

Далее мы создаем объект класса PixelGrabber:

PixelGrabber pgr = new PixelGrabber(
  img, 0, 0, nImageWidth, nImageHeight,
  pix, 0, nImageWidth);

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

Далее метод dropRed выполняет преобразование:

try
{
  pgr.grabPixels();  
}
catch(InterruptedException ie)
{
  return null;
}

Результатом этого преобразования будет заполненный массив pix.

На втором этапе метод dropRed обрабатывает массив, удаляя из пикселов красный цвет:

for(int i = 0; i < pix.length; i++)
{
  int nPixel = pix[i];
      
  int nG = 0xff & (nPixel >> 8);
  int nB = 0xff & nPixel;
      
  pix[i] = 0xff000000 | nG << 8 | nB;
}

Здесь мы берем исходный цвет и заменяем в нем значение красной компоненты на нуль.

Последний шаг в преобразовании - создание нового изображения на базе обработанного массива:

imgNew = createImage(
  new MemoryImageSource(
  nImageWidth, nImageHeight, pix,
  0, nImageWidth));

Эта задача решается с применением класса MemoryImageSource и метода createImage.

Метод paint

Метод paint просто рисует обработанное изображение в окне аплета:

public void paint(Graphics g)
{
  g.drawImage(img, 0, 0, this);
}

Назад Вперед

[Назад]