Электронная библиотека книг Александра Фролова и Григория Фролова.
Shop2You.ru Создайте свой интернет-магазин
Библиотека
Братьев
Фроловых
[Назад]

Библиотека примеров приложений Java

Оглавление
Растровые изображения в аплете

Растровые изображения в автономном приложении
Класс MediaTracker
Класс ImageObserver
Создание изображений
Фильтр RGBImageFilter
Фильтр CropImageFilter
Полупрозрачные изображения
Класс PixelGrabber
Внеэкранное изображение

Назад Вперед

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.

pic1.gif (22357 bytes)

Рис. 1. Два наложенных изображений в окне аплета

pic2.gif (22987 bytes)

Рис. 2. Изображение, которое рисуется в окне непрозрачным

pic3.gif (17464 bytes)

Рис. 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. Цветовые компоненты пикселов не изменяются.


Назад Вперед

[Назад]