Иллюстрированный самоучитель по Java
Как
переставить пикселы изображения
В листинге 15.4 определяется преобразование
пикселов изображения. Создается новый фильтр — расширение shiftFiiter класса
imageFilter, сдвигающее изображение циклически вправо на указанное в конструкторе
число пикселов. Все, что для этого нужно, — это переопределить метод setPixels().
Листинг 15.4.
Циклический сдвиг изображения
import j ava.awt.*;
import j ava.awt.event.*;
import j ava.awt.image.*;
class Shiftlmage
extends Frame{ private Image img, newimg;
Shiftlmage(String
s){
super(s);
// 1. Получаем
изображение из файла
img = getToolkit().getlmage("javalogo52x88.gif");
// 2. Создаем
экземпляр фильтра
ImageFilter imf
= new ShiftFiiter(26);
// Сдвиг на 26
пикселов
// 3. Получаем
новые пикселы с помощью фильтра
ImageProducer
ip = new FilteredlmageSource(img.getSource(), imf);
// 4. Создаем
новое изображение
newimg = createlmage(ip);
setSize(300, 200);
setvisible(true)
; }
public void paint(Graphics
gr){
gr.drawlmage(img,
20, 40, this);
gr.drawlmage(newimg,
100, 40, this); }
public static
void main(StringU args){
Frame f= new ShiftImage("
Циклический сдвиг изображения");
f.atidWindowListener(new
WindowAdapter()(
public void windowClosing(WindowEvent
ev){
System.exit(0);
)
});
}
}
// Класс-фильтр
class ShiftFilter
extends ImageFilterf
private int sh;
// Сдвиг на sh
пикселов вправо.
public ShiftFilter(int
shift)!{ sh = shift; }
public void setPixels(int
x, int y, int w, int h,
ColorModel m,
byte[] pix, int off, int size){
for (int k =
x; k < x+w; k++){
if (k+sh <=
w)
consumer.setPixels(k,
y, 1, h, m, pix, off+sh+k, size);
else
consumer.setPixels(k,
y, 1, h, m, pix, off+sh+k-w, size);
}
}
}
Как видно из листинга 15.4, переопределение
метода setPixels о заключается в том, чтобы изменить аргументы этого метода,
переставив, тем самым, пикселы изображения, и передать их потребителю consumer
— полю класса imageFiiter методом setPixels о потребителя. На рис. 15.4 показан
результат выполнения этой программы.
Вторая модель обработки изображения
введена в Java 2D. Она названа моделью
прямого доступа
(immediate mode
model).
Риc. 15.4.
Перестановка пикселов изображения