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

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);

//————————————— Кінець вставки ———————————————-

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