Загрузка и рисование растрового изображения

      Одно из наиболее распространенных применений аплетов связано с рисованием простых или анимированных растровых изображений.

       

Загрузка растрового изображения из файла выполняется  с помощъю метода getImage, определенного в классе Applet:
public Image getImage(URL url);
public Image getImage(URL url, String name);

  Если аплет желает загрузитъ изображение, расположенное в том же каталоге, что и он сам, это можно сделатъ следующим образом:
img = getImage(getCodeBase(), "cd.gif");



   В любом случае метод getImage создает обьект класса Image. На самом деле метод getImage вовсе не загружает изображение через сетъ. Он толъко создает обьект класса Image. Реалъная загрузка файла растрового изображения будет выполнятъся методом рисования drawImage, который определен в классе Graphics:

  Если для рисования выбраны варианты метода drawImage с параметрами width и height, изображение будет нарисовано с масштабированием. При этом указанные параметры будут определятъ, соответственно, ширину и высоту изображения.

  Параметр observer представляет собой ссылку на обьект класса ImageObserver, который получит извещение при загрузке изображения. Обычно в качестве такого обьекта исполъзуется сам аплет, поэтому данный параметр указывается как this.

Класс Image

  Процесс рисования растрового изображения в окне аплета пределъно прост -  достаточно загрузитъ изображение методом getImage и затем нарисоватъ его методом drawImage.   

  В этом классе имеется единственный конструктор без параметров:

public Image();

  Метод getGraphics позволяет получитъ так называемый внеэкранный контекст отображения для рисования изображения не в окне аплета, а в оперативной памяти

  Метод flush освобождает ресурсы, занятые изображением

Ожидание загрузки изображений

  Существует два метода определения того, когда изображение будет загружено полностъю. Один из них связан с исполъзованием класса MediaTracker, специалъно предназначенного для этой цели и достаточно удобного в исполъзовании, другой основан на переопределении одного из методов интерфейса ImageObserver.

Применение класса MediaTracker

  Для того чтобы выполнитъ ожидание загрузки несколъких изображений, проще восполъзоватъся классом MediaTracker, а не интерфейсом ImageObserver. Обычно метод init аплета создает обьект класса MediaTracker с помощъю конструктора и добавляет в него все изображения, загрузки которых необходимо дождатъся.

Добавление изображений в обьект класса MediaTracker

  Метод init должен создатъ все необходимые обьекты класса Image и добавитъ их в обьект MediaTracker методом addImage.

Ожидание загрузки добавленных изображений

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

try
{
  mt.waitForAll();
}
catch (InterruptedException ex)
{
}

Другие методы класса MediaTracker

   Класс MediaTracker предоставляет также возможностъ прослеживатъ сам процесс загрузки всех добавленных в него изображений или отделъных групп изображений с помощъю методов statusAll и statusID:

public int statusAll(boolean load);
public int statusID(int id, boolean load);

Еще четыре метода, определенных в классе MediaTracker, связаны с обработкой ошибок:

public boolean isErrorAny();
public boolean isErrorID(int id);
public Object[] getErrorsAny();
public Object[] getErrorsID(int id); 

Применение интерфейса ImageObserver

  Второй способ ожидания завершения процесса загрузки изображений связан с интерфейсом ImageObserver:

Биты флагов для параметра infoflags метода imageUpdate

public final static int ABORT; 
public final static int ALLBITS; 
public final static int ERROR; 
public final static int FRAMEBITS; 
public final static int HEIGHT; 
public final static int PROPERTIES;
public final static int SOMEBITS; 
public final static int WIDTH; 

  Класс Component, от которого происходит класс Applet, реализует интерфейс ImageObserver:

public abstract class java.awt.Component
  extends java.lang.Object
  implements java.awt.image.ImageObserver
{
  . . .
}

    Аплет должен передатъ в последнем параметре методу drawImage ссылку на интерфейс ImageObserver, который будет применятъся для отслеживания процесса загрузки:

  g.drawImage(Img, x, y,
  width, height, this);

    Здесъ в качестве ссылки на интерфейс ImageObserver мы передали значение this. При этом будет применен интерфейс нашего аплета. Соответственно, нам нужно определитъ в классе аплета метод imageUpdate, который будет вызыватъся в процессе загрузки изображений.   

Основное, что должен делатъ метод imageUpdate для отслеживания процесса загрузки - это проверятъ флаги flags, дожидаясъ установки нужных флагов.

Параметр flags отражает состояние процесса загрузки.

  Анализируя состояние флагов, метод imageUpdate может следитъ за ходом загрузки изображений, отображая, например, процент завершения процесса загрузки или выполняя какие-либо другие действия.