- •Обробка виключних ситуацій
- •6.0804 “Комп’ютерні науки”
- •1. Мета роботи
- •2.Основні теоретичні відомості
- •2.1. Оператори мови java
- •15.1. Модель обробки "поставщик-споживач"
- •15.2. Класи-фільтри
- •15.6. Модель обробки прямим доступом
- •15.8. Афінне перетворення зображення
- •15.7. Перетворення зображення в Java 2d
- •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.9. Зміна інтенсивности зображення
Зміна інтенсивності зображення виражається математично множеням кожної складової кольору на число factor і додаванням до результату множення числа offset. Результат приводиться до діапазону значень складової. Після цього інтенсивність кожної складової кольору лінійно змінюється в одному і тому ж масштабі. Числа factor і offset сталі для кожного пікселя і задаються в конструкторі класу разом з правилами візуалізації hints:
RescaleOp(float factor, float^offset, RenderingHints hints)
Після цього залишається застосувати метод filter().
На рис. 15.7 інтенсивність кожного кольору зменшена вдвічі, в результаті білий фон став сірим, а кольори - темнішими. Потім інтенсивність збільшена на 70 одиниць. В лістинзі 15.6 приведена программа, що виконує це перетворення.
Лістинг 15.6. Зміна інтенсивності зображення
Import java.Awt.*;
Import java.Awt.Image.*;
Import java.Awt.Event.*;
public class Rescale extends Frame{
private BufferedImage bi;
public Rescale(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 = new BufferedImage(img.getWidth(this), img.getHeight(this),
BufferedImage.TYPE_INT_RGB);
Graphics2D big = bi.createGraphics();
big.drawImage(img, 0, 0, this);
}
public void paint(Graphics g){
Graphics2D g2 = (Graphics2D)g;
int w = getSize().width;
int bw = bi.getWidth(this);
int bh = bi.getHeight(this);
BufferedImage bimg = new BufferedImage(bw, bh, BufferedImage.TYPE_INT_RGB);
//——————— Початок визначення перетворення --——-———
RescaleOp rop = new RescaleOp(0.5f, 70.0f, null);
rop.filter(bi, bimg);
//——————— Кінець визначення перетворення ———————
g2.drawImage(bi, null, 10, 30);
g2.drawImage(bimg, null, w/2+3, 30);
}
public static void main(String[] args){
Frame f = new Rescale(" Зміна інтенсивності");
f.addWindowListener(new WindowAdapter(){
public void windowClosing(WindowEvent e) {
System.exit(0);
}
});
f.setSize(300, 200);
f.setVisible(true);
}
}
Рис. 15.7. Зміна інтенсивності зображення
15.10. Зміна складових кольору
Щоб змінити окремі складові кольору, треба перш за все продивитися тип зберігання елементів в BufferedІmage, по замовчуванню це TYPE_INT_RGB. Тут три складові — червона, зелена і синя. Кожна складова кольору займає один байт, всі вони зберігаються в одному числі типу int. Потім треба скласти таблицю нових значень складових. В лістинзі 15.7 це двовимірний масив samples. Потім заповнюємо даний масив потрібними значеннями складових кожного кольору. В лістинзі 15.7 задається яскраво-червоний колір рисування і білий колір фону. По отриманій таблиці створюємо екземпляр класу ByteLookupTabІe, який звяже цю таблицю з буфером даних. Цей екземпляр використовуємо для створення обєкта класу LookupOp. Нарешті, застосовуємо метод filter() цього класу.
В лістинзі 15.7 приведений тільки фрагмент програми. Для одержання повної програми його треба вставити в лістинг 15.6 замість виділеного в ньому фрагмента. Логотип Java буде нарисований яскраво-червоним кольором.
Лістинг 15.7. Зміна складових кольору
//————————————— Вставити в лістинг 15.6 ————————
byte samples[][] = new byte[3][256];
for (int j = 0; j < 255; j++){
samples[0][j] = (byte)(255); // Червона складова
samples[1][j] = (byte)(0); // Зелена складова
samples[2][j] = (byte)(0); // Синя складова
}
samples[0][255] = (byte) (255); // Колір фону — білий
samples[1][255] = (byte) (255) ;
samples [2] [255] = (byte) (255) ;
ByteLookupTable blut=new ByteLookupTable(0, samples);
LookupOp lop = new LookupOp(blut, null);
lop.filter(bi, bimg);
//————————————— Кінець вставки ———————————————-
