Назад
Вперед
9.8. Полупрозрачные изображения
Помимо компонент цвета приложения Java могут
задавать для пикселов такую характеристику, как
прозрачность. Наложением полупрозрачных
изображений можно получит оригинальные
визуальные эффекты. В примере аплета
показывается наложение полупрозрачного
изображения на непрозрачное.
Исходный текст примера
Архив проекта для Java WorkShop 2.0
Демонстрация
(ваш браузер должен уметь работать с аплетами
Java JDK 1.1)
Немного теории
Те из вас, кто занимался подготовкой
графических иллюстраций для размещения на
сервере Web, знает о так называемых прозрачных
изображениях GIF. С помощью специального
редактора вы можете указать, что один из цветов в
изображении должен быть прозрачным.
Прозрачное изображение обычно размещают над
другим изображением или фоном для достижения
эффекта наложения.
Фильтры, созданные на базе интерфейса RGBImageFilter,
могут управлять прозрачностью более тонко.
Напомним вам, как выглядит такой фильтр:
class SomeMyOwnImageFilter
extends RGBImageFilter
{
public int filterRGB(int x, int y, int nRGB)
{
int nA = (nRGB >> 255) & 0xff;
int nR = (nRGB >> 16) & 0xff;
int nG = (nRGB >> 8) & 0xff;
int nB = nRGB & 0xff;
. . .
return((nA >> 255) | (nR << 16) |
(nG << 8) | nB);
}
}
За прозрачность пиксела отвечает поле nA. Оно
может принимать значения от 0 (полная
прозрачность) до 255 (полная непрозрачность).
С помощью фильтра вы можете сделать прозрачным
несколько цветов в изображении, а также создать
полупрозрачные изображения. Все это значительно
увеличивает возможности дизайнеров,
занимающихся оформлением страниц серверов Web.
Чтобы сделать все пикселы полупрозрачными,
достаточно в теле метода filterRGB установить
значение переменной nA, равное 128. Указывая другие
значения, вы можете устанавливать различную
прозрачность пикселов.
Описание примера
В окне нашего алпета одно изображение (рис. 3)
накладывается на другое (рис. 2). Результат такого
наложения показан на рис. 1.
Рис. 1. Два наложенных изображений в окне аплета
Рис. 2. Изображение, которое рисуется в окне
непрозрачным
Рис. 3. Это изображение преобразуется в
полупрозрачное
Рассмотрим исходный текст аплета.
Главный класс аплета AlphaDemo
В главном классе нашего аплета мы определили
два поля с именами img1 и img2:
import java.awt.*;
import java.applet.*;
import java.awt.image.*;
public class AlphaDemo extends Applet
{
Image img1;
Image img2;
. . .
}
Первое из них предназначено для хранения
ссылки на изображение, показанное на рис. 2, а
второе - для хранения ссылки на изображение,
показанное на рис. 3.
Метод init
При инициализации аплета метод init загружает
оба изображения:
img1 = getImage(getCodeBase(), "img1.jpg");
img2 = getImage(getCodeBase(), "img2.jpg");
Чтобы дождаться завершения процесса загрузки,
мы использовали класс MediaTracker:
MediaTracker mt = new MediaTracker(this);
mt.addImage(img1, 0);
mt.addImage(img2, 0);
try
{
mt.waitForAll();
}
catch(InterruptedException ie)
{
return;
}
Метод paint
Исходный текст этого метода предельно прост:
public void paint(Graphics g)
{
g.drawImage(img1, 0, 0, this);
g.drawImage(imgToTransparent(img2),
0, 0, this);
}
Здесь мы вначале рисуем первое изображение, а
затем второе. Второе изображение перед
рисованием преобразуется в полупрозрачное
методом imgToTransparent, определенным в нашем
приложении.
Метод imgToTransparent
Метод imgToTransparent получает через свой
единственный параметр исходное изображение,
делает его полупрозрачным и возвращает
результат как объект класса Image:
Image imgToTransparent(Image imgSrc)
{
. . .
}
Прежде всего метод imgToTransparent создает фильтр
класса TransparentImageFilter и объект класса ImageProducer:
TransparentImageFilter trFilter =
new TransparentImageFilter();
ImageProducer ip = new FilteredImageSource(
imgSrc.getSource(), trFilter);
Новое полупрозрачное изображение создается
методом createImage:
Image imTransparent = createImage(ip);
Чтобы дождаться завершения формирования
полупрозрачного изображения мы создаем объект
класса MediaTracker:
MediaTracker mt = new MediaTracker(this);
mt.addImage(imTransparent, 0);
try
{
mt.waitForAll();
}
catch(InterruptedException ie)
{
return null;
}
Если преобразование завершилось без ошибок,
метод imgToTransparent возвращает ссылку на созданное
изображение:
return imTransparent;
Класс TransparentImageFilter
В классе TransparentImageFilter мы определили метод filterRGB:
class TransparentImageFilter
extends RGBImageFilter
{
public int filterRGB(int x, int y, int nRGB)
{
int nAlpha = 0x80;
return((nAlpha << 24) | (nRGB & 0xffffff));
}
}
Единственное, что делает наш фильтр, это
устанавливает для параметр nAlpha значение 0x80.
Цветовые компоненты пикселов не изменяются.
Назад Вперед |