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

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

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

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

Назад Вперед

9.7. Работа с фильтром CropImageFilter

Пример показывает применение фильтра CropImageFilter для создания изображений отдельных кадров анимационной последовательности из одного "широкого" изображения.

Исходный текст примера

Архив проекта для Java WorkShop 2.0

Демонстрация
(ваш браузер должен уметь работать с аплетами Java  JDK 1.1)

Немного теории

С помощью готового фильтра CropImageFilter можно разрезать большое изображение на несколько маленьких или вырезать любой фрагмент изображения.

Этот фильтр удобен для работы с анимационными изображениями. Обычный способ создания анимации, описанный нами в разделе "6.4. Спрайтовая анимация", предполагает загрузку всех кадров из отдельных файлов. Однако известно, что через Internet быстрее загрузить одно большое изображение, чем несколько маленьких, равных по суммарной площади большому.

Поэтому для создания анимации лучше получить большое изображение и разрезать его на кадры, образовав несколько маленьких изображений.

Как пользоваться фильтром CropImageFilter?

Вначале нужно создать объект класса CropImageFilter:

CropImageFilter cf;
cf = new CropImageFilter(
   x, y, width, height);

Параметры x, y, width и height задают границы вырезаемой области исходного изображения.

Далее следует создать источник данных для изображения при помощи конструктора FilteredImageSource:

Image imgSrc;
FilteredImageSource is;

is = new FilteredImageSource(
  imgSrc.getSource(), cf);

В качестве первого параметра мы указываем источник данных исходного изображения, а в качестве второго - ссылку на фильтр класса CropImageFilter.

Теперь можно вырезать изображение:

Image imgResult = createImage(is);

Описание примера

В окне нашего аплета находится анимационное изображение вращающегося компакт-диска (рис. 1).

pic1.gif (1803 bytes)

Рис. 1. Изображение вращающегося компакт-диска в окне аплета

Кадры для этой анимации хранятся в едином графическом файле, содержимое которого показано на рис. 2.

pic2.gif (8236 bytes)

Рис. 2. Файл с кадрами анимации

Рассмотрим исходный текст аплета. Мы опишем только те методы главного класса, которые имеют отношение к использованию фильтра CropImageFilter.

Главный класс аплета реализует интерфейс Runnable, поэтому вся анимация выполняется методом run, определенным в этом классе.

Метод run

В начале своей работы метод run загружает изображения в массив m_Images, вызывая для этого метод loadImages:

m_Images = loadImages();

Далее он получает контекст отображения для окна аплета и запускает цикл анимации:

Graphics m_Graphics = getGraphics();
m_nCurrImage = 0;
                
while (true)
{
  displayImage(m_Graphics);
  m_nCurrImage++;

  if(m_nCurrImage == NUM_IMAGES)
    m_nCurrImage = 0;

  try
  {
    Thread.sleep(100);
  }
  catch (InterruptedException e)
  {
    stop();
  }
}

В этом цикле метод run последовательно увеличивает номер текущего отображаемого кадра m_nCurrImage от нуля до значения NUM_IMAGES, а потом начинает этот процесс снова. Каждый раз текущий кадр рисуется в окне аплета методом displayImage.

Метод loadImages

Метод loadImages готовит для отображения упомянутый выше массив изображений m_Images и возвращает ссылку на него.

Первым делом метод создает массив:

Image[] im = new Image[NUM_IMAGES];

Далее он получает исходное изображение imgSrc, загружая его из файла cdrom.gif:

Image imgSrc;
    
imgSrc = getImage(getDocumentBase(), 
  "cdrom.gif");

Чтобы дождаться завершения процесса загрузки, мы применили класс MediaTracker:

MediaTracker mt = new MediaTracker(this);
mt.addImage(imgSrc, 0);
    
try
{
  mt.waitForAll();
}
catch (InterruptedException e)
{
  return null;
}

На следующем этапе выполняется "нарезка".

Метод loadImages создает фильтр CropImageFilter в цикле для каждого кадра анимации, представляющего собой квадрат со стороной размером 34 пиксела:

CropImageFilter cf;
FilteredImageSource is;
          
mt = new MediaTracker(this);
    
for(int i = 0; i < NUM_IMAGES; i++)
{
  cf = new CropImageFilter(
    34 * i, 0, 34, 34);

  is = new FilteredImageSource(
    imgSrc.getSource(), cf);

  im[i] = createImage(is);
  mt.addImage(im[i], 0);
}

С применением этого фильтра на каждой итерации цикла создается объект класса FilteredImageSource и выходное изображение кадра (методом createImage). Созданное изображение сразу же добавляется в MediaTracker.

Когда создание всех кадров будет завершено, метод возвращает ссылку на массив изображений im:

try
{
  mt.waitForAll();
}
catch (InterruptedException e)
{
  return null;
}
    
return im;

В дальнейшем метод run будет брать из этого массива отдельные кадры анимации и рисовать их по очереди в окне аплета.


Назад Вперед

[Назад]