Изображение и звук

 

Изображение в Java — это объект класса image, представляющий прямоугольный массив пикселов. Его могут показать на экране логические методы drawimageo класса Graphics. Мы рассмотрим их подробно в следующей главе, а пока нам понадобятся два логических метода:

drawlmage(Image img, int x, int y, ImageObserver obs) 

drawImage(Image img, int x, int y, int width, int height, 

ImageObserver obs)

Методы начинают рисовать изображение, не дожидаясь окончания загрузки изображения img. Более того, загрузка не начнется, пока не вызван метод drawlmage(). Методы возвращают false, пока загрузка не закончится.

Аргументы (х, у) задают координаты левого верхнего угла изображения img; width и height — ширину высоту изображения на экране; obs — ссылку на объект, реализующий интерфейс ImageObserver, следящий за процессом загрузки изображения. Последнему аргументу можно дать значение this.

Первый метод задает на экране такие же размеры изображения, как и у объекта класса image, без изменений. Получить эти размеры можно методами getWidth(), getHeight{) класса Image.

Интерфейс ImageObserver, реализованный классом Component, а значит, и классом Applet, описывает только один логический метод imageUpdate (),

выполняющийся при каждом изменении изображения. Именно этот метод побуждает перерисовывать компонент на экране при каждом его изменении. Посмотрим, как его можно использовать в процессе загрузки файлов из Internet.

 

Слежение за процессом загрузки

 

Если вы хотя бы раз видели, как изображение загружается из Internet, то заметили, что оно появляется на экране по частям по мере загрузки. Это происходит в том случае, когда системное свойство awt.image. incrementalDraw имеет значение true.

При поступлении каждой порции изображения браузер вызывает логический метод imageUpdate () интерфейса ImageObserver. Аргументы этого метода содержат информацию о процессе загрузки изображения img. Рассмотрим их:

imageUpdate(Image img, int status, int x, int y, int width, int height);

Аргумент status содержит информацию о загрузке в виде одного целого числа, которое можно сравнить со следующими константами интерфейса ImageObserver:

  • WIDTH — ширина уже загруженной части изображения известна, и может быть получена из аргумента width;
  • HEIGHT — высота уже загруженной части изображения известна, и может быть получена из аргумента height;’
  • PROPERTIES — свойства изображения уже известны, их можно получить методом getProperties{) класса Image;
  • SOMEBITS — получены пикселы, достаточные для рисования масштабированной версии изображения; аргументы x, y, width, height определены;
  • FRAMEBITS — получен следующий кадр изображения, содержащего несколько кадров; аргументы x, y, width, height не определены;
  • ALLBITS — все изображение получено, аргументы x, y, width, height не содержат информации;
  • ERROR — загрузка прекращена, рисование прервано, определен бит ABORT ;
  • ABORT — загрузка прервана, рисование приостановлено до прихода следующей порции изображения.

Вы можете переопределить этот метод в своем апплете и использовать его аргументы для слежения за процессом загрузки и определения момента полной загрузки.

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

 

Класс MediaTracker

 

Сначала конструктором MediaTracker (Component comp) создается объект класса для указанного аргументом компонента. Аргумент конструктора чаще всего this.

Затем методом addlmagef Image img, int id) регистрируется Изображение img под порядковым номером id. Несколько изображений можно зарегистрировать под одним номером.

После ЭТОГО логическими методами checkID(int id), checkID(int id, boolean load) и checkAii () проверяется, загружено ли изображение с порядковым номером id или все зарегистрированные изображения. Методы возвращают true, если изображение уже загружено, false — в противном случае. Если аргумент load равен true, то производится загрузка всех еще не загруженных изображений.

Методы statusID(int id), statusID(int id, boolean load) и statusALL возвращают целое число, которое можно сравнить со статическими константами COMPLETE, ABORTED, ERRORED.

Наконец, методы waitForID(int id) и waitForAll() ожидают окончания загрузки изображения.

В следующей главе в листинге 15.5 мы применим эти методы для ожидания загрузки изображения.

Изображение, находящееся в объекте класса image можно создать непосредственно по пикселам, а можно получить из графического файла, типа GIF или JPEG, одним из двух методов класса Applet:

  • getimage(URL address) — задается URL-адрес графического файла;
  • getImage(URL address, String fileName) — задается адрес каталог address и имя графического файла filename .

Аналогично, звуковой файл в апплетах Представляется в виде объекта, реализующего интерфейс Audiociip, и может быть получен из файла типа AU, AIFF, WAVE или MIDI одним из трех методов класса Applet с такими же аргументами:

getAudioClip(URL address)

getAudioClip(URL address, String fileName)

newAudioClip(URL address)

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

Интерфейс Audioclip из пакета java. applet очень прост. В нем всего три метода без аргументов. Метод play () проигрывает мелодию один раз. Метод loop () бесконечно повторяет мелодию. Метод stop о прекращает проигрывание. 

Этот интерфейс реализуется браузером. Конечно, перед проигрыванием звуковых файлов браузер должен быть связан со звуковой системой компьютера.

В листинге 14.9 приведен простой пример загрузки изображения и звука из файлов, находящихся в том же каталоге, что и HTML-файл.

 

Листинг 14.9, Звук и изображение в апплете

i mport java.applet.*;

import j ava.awt.*;

import java.awt.image.*;

public class SimpleAudioImage extends Applet{ 

private Image img; 

private Audioclip ac; 

public void init(){

img = getImage(getDocumentBase(), «javalogo52x88.gif»);

ac = getAudioClip(getDocumentBase(), «yesterday.au»); }

public void start (){ ac.loop(); 

public void paint(Graphics g){

int w = img.getWidthfthis), h = img.getHeight(this);

g.drawlmage(img, 0, 0, 2 * w, 2 * h, this); }

public void stop() { ac.stop(); } 

}

Перед выводом на экран изображение можно преобразовать, но об этом поговорим в следующей главе.

Как видите, апплету в браузере позволено очень немного. Это не случайно. Апплет, появившийся в браузере откуда-то из Internet, может натворить много бед. Он может быть вызван из файла с увлекательным текстом, невидимо обыскать файловую систему и похитить секретные сведения, или, напротив, открыть окно, неотличимое от окна, в которое вы вводите пароль, и перехватить его.

Поэтому браузер сообщает при загрузке апплета: «Applet started», а в строке состояния окна, открытого апплетом, появляется надпись: «Warning: Applet Window».

Но это не единственная защита от апплета. Рассмотрим данную проблему подробнее.