Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Lab11_Java_Vkazivky_2010_Mutimedia in Java_ Ima....doc
Скачиваний:
1
Добавлен:
17.04.2019
Размер:
863.23 Кб
Скачать

15.7. Перетворення зображення в Java 2d

Перетворення зображення source, що зберігається в обєкті класу Buffеredlmage, в нове зображення destination виконується методом filter(Buffredlmage source, Buffredlmage destination) описаним в інтерфейсі BuffredІmageOp. Указаний метод повертає посилку на новий, змінений обєкт destination класу Buffredlmage, що дозволяє задати ланцюжок послідовних перетворень. Можна перетворювати тільки координатну систему зображення методом filter(Raster source, WritableRaster destination) повертаючим посилку на змінений обєкт класу WritableRaster. Даний метод описано в інтерфейсі RasterOp. Спосіб перетворення визначається класом, реалізуючим ці інтерфейси, а параметри перетворення задаються в конструкторі класу. В пакеті java.awt.image єсть шість класів, реалізуючих інтерфейси BuffredІmageOp і RasterOp:

  • AffineTransformOp — виконує афінне перетворення зображення: зcув, поворот, відображення, стискання або розтягування по вісям;

  • RescaІeOp — змінює інтенсивність зображення;

  • LookupOp — змінює окремі складові кольору зображення;

  • BandCombineOp — мінює складові кольору в Raster;

  • СolorConvertdp — змінює кольорову модель зображення;

  • ConvolveOp — виконує згортання, що дозволяє змінити контраст і/або яскравість зображення, створити ефект "розмитості" і інші ефекти.

Рис. 15.5. Класи, реалізуючі модель прямого доступу

Розглянемо, як можна застосувати ці класи для перетворення зображення.

15.8. Афінне перетворення зображення

Клас AffineTransform і його використання детально розібрані в уроці 9, тут ми тільки застосуємо його для перетворення зображення. В конструкторі класу AffineTransformOp указується попередньо створене афінне перетворення at і спосіб інтерполяції interp і/або правила візуалізації hints:

AffineTransformOp(AffineTransform at, int interp);

AffineTransformOp(AffineTransform at, RenderingHints hints);

Спосіб інтерполяції — це одна із двох констант: TYPE_NEAREST_NEIGHBOR (по замовчуванню в другому конструкторі) або TYPE_BILINEAR. Після створення обєкту класу AffineTransformOp застосовується метод filter(). При цьому зображення перетворюється всередині нової області типу BufferedІmage, як показано на рис. 15.6, справа. Сама область виділена чорним кольором. Другий спосіб афінного перетворення зображення — застосувати метод drawlmage(Bufferedlmage img, BufferedlmageOp op, int x, int y) класу Graphics2D. При цьому перетворюється вся область img, як продемонстровано на рис. 15.6, посередині. В лістинзі 15.5 показано, як задаються перетворення, представлені на рис. 15.6. Зверніть увагу на особливості роботи з BufferedІmage. Треба створити графічний контекст зображення і вивести в нього зображення. Ці дії здаються зайвими, але зручні для подвійної буферизації, яка зараз стала стандартом перерисовування зображень, а в біблиотеці Swing виконується автоматично.

Лістинг 15.5. Афінне перетворення зображення

import java.awt.*;

import java.awt.geom.*;

import java.awt.image.*;

import java.awt.event.*;

public class AffOp extends Frame{

private BufferedImage bi;

public AffOp(String s){ super (s) ;

// Завантажуємо зображення

Image img = getToolkit().getImage("javalogo52x88.gif");

// В цьому блоці організовано очікування завантаження

try{

MediaTracker mt = new MediaTracker(this);

mt.addImage(img, 0);

mt.waitForID(0);

// Чекаємо закінчення завантаження

}

catch(Exception e){}

// Розміри створюваної області bi співпадають з розмірами зображення img

bi = new BufferedImage(img.getWidth(this), img.getHeight(this), BufferedImage.TYPE_INT_RGB);

// Створюємо графічний контекст big зображення bi

Graphics2D big = bi.createGraphics();

// Виводимо зображення img в графічний контекст

big.drawImage(img, 0, 0, this);

}

public void paint(Graphics g){

Graphics2D g2 = (Graphics2D)g;

int w = getSize().width;

int h = getSize().height;

int bw = bi.getWidth(this);

int bh = bi.getHeight(this);

// Створюємо афінне перетворення

AffineTransform at = new AffineTransform();

at.rotate(Math.PI/4); // Задаємо поворот на 45 градусів

//по годинниковій стрілці навколо лівого верхнього кута.

//Потім зсуваємо зображення вправо на величину bw

at.preConcatenate(new AffineTransform(1, 0, 0, 1, bw, 0));

// Визначаємо область зберігання bimg перетвореного

// зображення. Її розмір вдвічі больший попереднього

BufferedImage bimg = new BufferedImage(2*bw, 2*bw, BufferedImage.TYPE_INT_RGB);

// Створюємо обєкт biop, що містить перетворення at

BufferedImageOp biop = new AffineTransformOp(at, AffineTransformOp.TYPE_NEAREST_NEIGHBOR);

// Перетворюємо зображення, результат заносимо в bimg

biop.filter(bi, bimg);

// Виводимо початкове зображення.

g2.drawImage(bi, null, 10, 30);

// Виводимо змінене перетворенням biop область bi

g2.drawImage(bi, biop, w/4+3, 30);

// Виводимо перетворене всередині області bimg зображення

g2.drawImage(bimg, null, w/2+3, 30); }

public static void main(String[] args){

Frame f = new AffOp(" Афінне перетворення");

f.addWindowListener(new WindowAdapter(){

public void windowClosing(WindowEvent e){

System.exit(0);

}

});

f.setSize(400, 200);

f.setVisible(true) ;

}

}

На рис. 15.6 показано початкове зображення, перетворена область і перетворене всередині області зображення.

Рис. 15.6. Афінне перетворення зображення

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]