Модель обработки "поставщик-потребитель"
Очень часто изображение перед выводом на экран подвергается обработке: меняются цвета отдельных пикселов или целых участков изображения, выделяются и преобразуются какие-то фрагменты изображения.
В библиотеке AWT применяются две модели обработки изображения. Одна модель реализует давно известную в программировании общую модель "поставщик-потребитель" (Producer-Consumer). Согласно этой модели один объект, "поставщик", генерирует сам или преобразует полученную из другого места продукцию, в данном случае, набор пикселов, и передает другим объектам. Эти объекты, "потребители", принимают продукцию и тоже преобразуют ее при необходимости. Только после этого создается объект класса image и изображение выводится на экран. У одного поставщика может быть несколько потребителей, которые должны быть зарегистрированы поставщиком. Поставщик и потребитель активно взаимодействуют, обращаясь к методам друг друга.
В AWT эта модель описана В двух интерфейсах: ImageProducer и ImageConsumer пакета java.awt.image.
Интерфейс ImageProducer описывает пять методов:
- addConsumer(ImageConsumer ic) – регистрирует потребителя ic;
- removeConsumer (ImageConsumer ic) – отменяет регистрацию;
- isConsumer(ImageConsumer ic) – логический метод, проверяет, зарегистрирован ли потребитель ic;
- startProduction (ImageConsumer ic) – регистрирует потребителя ic и начинает поставку изображения всем зарегистрированным потребителям;
- requestTopDownLeftRightResend (ImageConsumer ic) – используется потребителем для того, чтобы затребовать изображение еще раз в порядке "сверху-вниз, слева-направо" для методов обработки, применяющих именно такой порядок.
С каждым экземпляром класса image связан объект, реализующий интерфейс ImageProducer. Его можно получить методом getSource () класса Image.
Самая простая реализация интерфейса ImageProducer – класс меmоrу-imagesource – создает пикселы в оперативной памяти по массиву байтов или целых чисел. Вначале создается массив pix, содержащий цвет каждой точки. Затем одним из шести конструкторов создается объект класса MemoryimageSource. Он может быть обработан потребителем или прямо преобразован в тип Image методом createlmage ().
В листинге 15.1 приведена простая программа, выводящая на экран квадрат размером 100x100 пикселов. Левый верхний угол квадрата синий, левый нижний – красный, правый верхний – зеленый, а к центру квадрата цвета перемешиваются.
Листинг 15.1. Изображение, построенное по точкам.
import java.awt.*; import java.awt.event.*; import java.awt.image.*; class InMemory extends Frame { private int w = 100, h = 100; private int[] pix = new int[w * h]; private Image img; InMemory(String s)(super(s); int <strong>i =</strong> 0; for (int у = 0; у < h; y++){ int red = 255 * у / (h -1); for (int x = 0; x < w; x++){ int green = 255 * x / (w -1); pix[i++] = (255 << 24)|(red << 16)|(green << 8)| 128; } } setSize(250, 200); setVisible(true); } public vqid paint(Graphics gr){ if (img == null) img = createlmage(new MemoryImageSource<w, h, pix> 0, w)); gr.drawlmage(img, 50, 50, this); } public static void main(String[] args){ Frame f= new InMemory(" Изображение в памяти"); f.addWindowListener(new WindowAdapter(){ public void windowClosing(WindowEvent ev){ System.exit (0); } }); } }