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