- •Обробка виключних ситуацій
- •6.0804 “Комп’ютерні науки”
- •1. Мета роботи
- •2.Основні теоретичні відомості
- •2.1. Оператори мови java
- •15.1. Модель обробки "поставщик-споживач"
- •15.2. Класи-фільтри
- •15.6. Модель обробки прямим доступом
- •15.7. Перетворення зображення в Java 2d
- •15.8. Афінне перетворення зображення
- •15.9. Зміна інтенсивности зображення
- •Import java.Awt.*;
- •Import java.Awt.Image.*;
- •Import java.Awt.Event.*;
- •15.10. Зміна складових кольору
- •15.11. Створення різних эфектів
- •Import java.Awt.*;
- •Import java.Awt.Event.*;
- •15.13. Покращення зображення подвійною буферизацією
- •50, 50, 0, 360, Arc2d.Open));
- •15.14. Звук
- •Import java.Applet.* ;
- •Import java.Net.*;
- •15.15. Програвання звуку в Java 2
- •Import javax.Sound.Sampled.*;
- •Import java.Io.*;
- •If (!AudioSystem.IsLineSupported(info)){
- •Import javax.Sound.Sampled.*;
- •Import java.Io.*;
- •If (!AudioSystem.IsLineSupported(info)){
- •Import javax.Sound.Midi.*;
- •Import java.Io.*;
- •15.16. Синтез і запис звуку в Java 2
- •Import javax.Sound.Midi.*;
- •Import java.Io.*;
- •3.Контрольні запитання
- •4.Лабораторне завдання
- •Мета роботи.
- •Список рекомендованої літератури
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. Афінне перетворення зображення