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

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

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

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

Назад Вперед

9.5. Создание изображений в оперативной памяти

Пример показывает, как можно создать изображение класса Image на основе массива пикселов. Демонстрируется использование класса MemoryImageSource.

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

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

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

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

До сих пор в наших примерах мы создавали изображения класса Image на базе файлов формата JPG и GIF. Однако есть и другая возможность - вы можете образовать такой объект из массива чисел, описывающих цветовые характеристики отдельных пикселов изображения.

Сделать это достаточно просто.

Прежде всего вам нужно подготовить массив чисел типа int. Размер этого массива должен быть достаточным для хранения в нем всех пикселов изображения. Например, если вы создаете изображение размером 256 x 128 пикселов, то массив можно создать так:

int[] pixels = new int[255 * 128];

Далее нужно подготовить данные для каждого пиксела.

В простейшем случае каждый элемент массива содержит 8-разрядные поля прозрачности nAlpha, красной компоненты цвета nRed, зеленой компоненты nGreen и голубой компоненты nBlue.

Вот как они должны быть скомбинированы перед записью в элемент массива пикселов:

pixels[i] = (nAlpha << 256) |
 (nRed << 16) | (nGreen << 8) | nBlue;

Если прозрачность равна 255, пиксел будет непрозрачным, если 128 - прозрачным наполовину, а если 0 - полностью прозрачным.

Далее изображение класса Image создается методом createImage, определенным в классе Component. Этому методу нужно передать ссылку на объект класса MemoryImageSource, созданный при помощи соответствующего конструктора.

Проще всего воспользоваться конструктором следующего вида (предполагающим использование цветовой схемы, принятой по умолчанию):

public MemoryImageSource(int w, int h, 
  int pixels[], int off, int scan);

В качестве параметров w и h вы должны передать конструктору размеры изображения. Параметр pixels предназначен для передачи ссылки на подготовленный массив пикселов. Что же касается параметров off и scan, то первый из них указывает смещение начала данных изображения в массиве pixels, а второй - ширину изображения.

Таким образом, чтобы создать изображение размером 256 x 128 пикселов, мы можем поступить следующим образом:

Image img;
img = createImage(new MemoryImageSource(
  255, 128, pixels, 0, 255));

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

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

Наш аплет CreateImage создает изображение оттенков красного, зеленого и голубого цветов, а затем отображает его в окне аплета при помощи метода drawImage (рис. 1).

pic1.gif (6403 bytes)

Рис. 1. Оттенки трех цветов в окне аплета

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

Главный класс

Главный класс аплета создан на базе класса Applet:

import java.awt.*;
import java.awt.image.*;
import java.applet.*;

public class CreateImage extends Applet
{
  . . .
}

Обратите внимание, что мы включили в исходный текст определение классов java.awt.image.*. Это нам нужно для работы с классом MemoryImageSource.

В главном классе аплета определено единственное поле img:

Image img;

В него мы запишем ссылку на созданное изображение класса Image.

Метод init

При инициализации аплета метод init создает изображение класса Image.

Как он это делает?

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

int[] pixels = new int[255 * 128 * 3];

Ширина создаваемого нами изображения равна 256 пикселам, а высота - 128 * 3 пикселам. Все изображение делится на три области, в каждой из которых мы нарисуем оттенки соответствующего цвета. Высота областей равна 128 пикселам.

Заполнение области красного цвета выполняется так:

int x;
int y;
int clrR = 0;
int clrG = 0;
int clrB = 0;
int i = 0;
    
for(y = 0; y < 128; y++)
{
  for (x = 0; x < 255; x++) 
  {
    pixels[i++] = 
      0xff000000 | 
      (clrR << 16) | (clrG << 8) | clrB;
  }
  clrR += 2;
}

Здесь мы установили значения голубой и зеленой компоненты, равными нулю, а значение красной компоненты плавно увеличиваем в цикле на два. Компонента прозрачности имеет значение 255, поэтому пикселы будут непрозрачными.

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

clrR = 0;
clrB = 0;
for(y = 128; y < 256; y++)
{
  for (x = 0; x < 255; x++) 
  {
    pixels[i++] = 
      0xff000000 | 
      (clrR << 16) | (clrG << 8) | clrB;
  }
  clrG += 2;
}
      
clrR = 0;
clrG = 0;
for(y = 256; y < 384; y++)
{
  for (x = 0; x < 255; x++) 
  {
    pixels[i++] = 
      0xff000000 | 
      (clrR << 16) | (clrG << 8) | clrB;
  }
  clrB += 2;
}

Когда подготовка массива пикселов будет завершена, метод init создаст изображение, вызвав для этого конструктор класса MemoryImageSource и метод createImage:

img = createImage(new MemoryImageSource(
  255, 384, pixels, 0, 255));
Метод paint

Метод paint просто рисует созданное изображение в окне аплета методом drawImage:

public void paint(Graphics g)
{
  g.drawImage(img, 0, 0, this);
}

Назад Вперед

[Назад]