Назад
Вперед
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).
Рис. 1. В окне аплета показывается обработанное
изображение
Исходное изображение представлено на рис. 2.
Рис. 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);
}
Назад Вперед |