Как выделить фрагмент изображения
В листинге 15.2 выделяется фрагмент изображения и выводится на экран в увеличенном виде. Кроме того, ниже выводятся изображения, увеличенные с помощью классов RepiicateScaieFiiter и AreaAveragingScaleFilter.
Листинг 15.2. Примеры масштабирования изображения
import j ava.awt.*;
import j ava.awt.event.*;
import j ava.awt.image.*;
class CropTest extends Frame{
private Image img, cropimg, replimg, averimg;
CropTest(String s){ super (s) ;
// 1. Создаем изображение — объект класса Image
img = getToolkit().getlmage("javalogo52x88.gif");
// 2. Создаем объекты-фильтры:
// а) выделяем левый верхний угол размером 30x30
CropImageFilter crp = new CropImageFilter(0, 0, 30, 30);
// б) увеличиваем изображение в два раза простым методом
RepiicateScaieFiiter rsf = new RepiicateScaieFiiter(104, 176);
// в) увеличиваем изображение в два раза с усреднением
AreaAveragingScaleFilter asf = new AreaAveragingScaleFilter(104, 176);
// 3. Создаем измененные изображения
cropimg = createlmage(new FilteredlmageSource(img.getSource(), crp));
replimg = createlmage(new FilteredlmageSource(img.getSource(), rsf)};
averimg = createlmage(new FilteredlmageSource(img.getSource(), asf));
setSize(400, 350); setvisible(true); }
public void paint(Graphics gS { g.drawlmage(img, 10, 40, this);
g.drawlmage(cropimg, 150, 40, 100, 100, this);
g.drawlmage(replimg, 10, 150, this);
g.drawlmage(averimg, 150, 150, this);
}
public static void main(String[] args){
Frame f= new CropTest(" Масштабирование");
f.addWindowListener(new WindowAdapter(){
public void windowClosing(WindowEvent ev){
System.exit(0);
}
});
}
}
На рис. 15.3 слева сверху показано исходное изображение, справа — увеличенный фрагмент, внизу — изображение, увеличенное двумя способами.
Рис. 15.3. Масштабированное изображение
Как изменить цвет изображения
В листинге 15.3 меняются цвета каждого пиксела изображения. Это достигается просто сдвигом rgb » 1 содержимого пиксела на один бит вправо в методе fiiterRGB (). При этом усиливается красная составляющая цвета. Метод f iiterRGB о переопределен в расширении coiorFilter класса RGBImageFilter.
Листинг 15.3. Изменение цвета всех пикселов ;
import j ava.awt.*;
import java.awt.event.*;
import java.awt.image.*;
class RGBTest extends Frame{
private Image img, newimg;
RGBTest(String s){
super(s);
img = getToolkit().getlmage("javalogo52x88.gif");
RGBImageFilter rgb = new CoiorFilter();
newimg = createlmage(new FilteredlmageSource(img.getSource(), rgb));
setSize(400, 350);
setVisible(true); } public void paint(Graphics g){
g.drawlmage(img, 10, 40, this);
g.drawlmage(newimg, 150, 40, this); }
public static void main(String[] args){
Frame f= new RGBTest(" Изменение цвета");
f.addWindowListener(new WindowAdapter(){
public void wlndowClosing(WindowEvent ev){
System.exit(0);
}
});
)
}
class CoiorFilter extends RGBImageFilter{ CoiorFilter(){
canFilterlndexColorModel = true; }
public int fiiterRGB(int x, int y, int rgb){
return rgb » 1;
}
}
Как переставить пикселы изображения
В листинге 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. Перестановка пикселов изображения
| Maya 3D графика в кино и телевидении Воздействие испытаний ядерного оружия на здоровье населения Объектно-ориентированный язык программирования Java Объектно-ориентированное программирование Delphi Библиотека визуальных компонентов VCL и ее базовые классы Кроссплатформенное программирование для Linux Элементы управления Win32 Элементы управления Windows XP Файлы и устройства ввода/вывода Что такое экспертная система? Объектно-ориентированное программирование Инструментальные средства разработки экспертных систем Программирование на языке CLIPS Критерии и количественные характеристики надежности Расчет характеристик надежности невостанавливаемых резервированных изделий Расчет надежности системы с постоянным резервированием Интегрирование тригонометрических функций ; |