Програмування мовою JAVA - Робота із зображеннями
Java працює з найбільш популярними у Всесвітньому павутинні форматами зображень - JPEG і GIF. JPEG краще підходить для природних кольорових зображень, таких як фотографії, а формат GIF є найкращими для графічних емблем, зображень кнопок і т.п.
Спочатку ми завантажимо зображення за допомогою дуже короткої програми. Потім ми навчимося використовувати класи, які керують завантаженням одного або кількох зображень. Крім того, існує набір абстрактних класів, які допомагають створити потік зображень, та фільтри, що дозволяють звертатися до окремих елементів зображень та модифікувати їх.
Простий завантажувач зображень
Найпростіший випадок — завантаження до сторінки одиночного зображення. Ось маленький аплет, який виконує цю роботу:
public class SimpleImageLoad extends Applet
public void init()
art = getImage(getDocumentBase(), getParameter("img"));
public void paint(Graphics g)
g.drawImage(art, 0, 0, this);
ImageObserver — це абстрактний інтерфейс, який використовується для отримання повідомлення про створення зображення. Метод imageUpdate із ImageObserver — це все, що ви повинні реалізувати у своєму аплеті для його використання. У той час, як ви отримуєте інформацію про завантаження, ви можете показувати будь-яку мультиплікацію, що вам сподобалася, індикатор ступеня завершення завантаження або будь-яку іншу заставку. Для використання ImageObserver у своєму підкласі Applet ви повинні додати до нього рядок implement Image O bserver, як показано в цьому фрагменті програми:
public class MyApplet extends Applet implement ImageObserver
Потім вам доведеться вставити в свій клас метод imageUpdate для інтерфейсу ImageObserver, як показано в наступному фрагменті:
public booleanimageUpdate(Image img, int status,
int x, int у int width, int height)
if((status &ALL ALLBITS) != 1)
System.out.println("Still processing the image");
System.out.println("Done processing the image");
Метод imageUpdate викликається із зображенням Image, яке знаходиться в процесі зміни, цілим параметром status, що відображає стан зміни, і координатами прямокутника (x, у, width, height), які відповідають різним величинам залежно від інформаційних прапорів, перерахованих нижче. ImageUpdate повинен повертати false після закінчення завантаження зображення і true - якщо зображення ще обробляється.
Ціла змінна status порозрядно перевіряється на наявність одного або кількох прапорів. Можливі прапори та інформація, яку вони несуть, наведено нижче:
Ширина зображення доступна і може бути взята з width аргументу.
Висота зображення доступна і може бути взята з аргументу height.
Властивості зображення доступні. Ви можете отримати їх за допомогою art.properties.
Доступні пікселі, необхідні малювання масштабованого варіанта зображення. Область, що містить нові пікселі, визначається параметрами x, у, width і height.
Ще один кадр раніше намальованого зображення з кількома кадрами готовий для перемальовування. Параметри x, у, width, heightне містять інформації.
Обробка зображення, що перемальовується, закінчена, і воно може бути відмальоване в кінцевому вигляді. Значення аргументів x, у, width і height не містять значущої інформації.
При надсиланні зображення виникла помилка. Надходження подальшої інформації стало неможливим і малювання перервано. Для зручності виставляється прапор ABORT для індикації переривання завантаження зображення.
Пересилання зображення було перервано до повного отримання. Надходження нової інформації стало неможливим без додаткових дій щодо повторного запуску операцій з отримання зображення. Якщо прапор ERROR не був виставлений, прихід будь-яких даних зображення знову запустить процес його отримання.
Тепер розглянемо програмний приклад, який використовує ImageObserver для показу кількості оброблених рядків зображення і виводить цю інформацію (змінна progress) на консоль:
public class ObservedImageLoad extends Applet
implements Runnable, ImageObserver
public void init()
art = getImage(getDocumentBase(), getParameter("img"));
public void paint(Graphics g)
loaded = g.drawImage(art, 0, 0, це);
public boolean imageUpdate(Image img, int info,