Назад
Вперед
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).
Рис. 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);
}
Назад Вперед |