Delphi | Сети | ПК | Маршрутизаторы | Моделирование | Протоколы | Экспертные системы | Удаленный доступ | Доменные имена
Аплеты | SQL | Надежность | Задачи | Информационные процессы | JAVA | Отказы изделия | Расчет надежности показателей | Инфсис

Изображения и звук в Java

Текст в окно будем выводить крупным шрифтом размером 24, поэтому сначала создадим объект класса Font. Обратите внимание, что в одном и том же операторе объявляется переменная font типа Font и создается сам объект с помощью операции new. Для этого вызывается конструктор объекта с тремя параметрами. В качестве второго аргумента передается значение статической переменной BOLD класса Font. Выберем созданный шрифт в контекст окна и напечатаем строку "Изучаем Java!".

Как выделить фрагмент изображения

В листинге 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. Перестановка  пикселов изображения

 

Математический анализ, лекции по физике Компьютерные сети