MIDP 2.0: Работа с точками изображения напрямую, прозрачность, drawRGB()
В этом документе описывается работа с изображениями, сохраненными в виде массива точек. В частности рассматриваются следующие вопросы:
- Формат массива данных, содержащего информацию о рисунке.
- Различия между непрозрачными и прозрачными точками.
- Использование метода drawRGB().
- Создание и загрузка изображения в массив.
- Создание объекта Image из массива.
- Манипуляция отдельными точками.
Вообще, использование MIDP 2.0 позволяет значительно улучшить графическую составляющую игры, а также реализовать сложные сетевые модели взаимодействия.
ARGB Image
MIDP 2.0 позволяет представлять изображение в виде массива целых чисел, и трансформировать его, воздействуя на отдельные элементы массива. Каждый элемент массива соответствует одному пикселю. Число, содержащееся в элементе массива, определяется следующим образом: 8 бит:(A) Альфа составляющая, отвечающая за прозрачность 8 бит:(R) Красный 8 бит:(R) Зеленый 8 бит:(R) Синий
На приведенном ниже рисунке схематично показан формат числа
1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 1 0 1 0 1 0 1 1 0 1 0 1 0 1 0
Каждое такое восьмибитное значение обычно называютканалом. Временно не будем трогать первые 8 бит. Красному каналу (вторые 8 бит) на представленной схеме соответствует число 0000 0000 (Ox00), зеленому - 0101 0101 (Ox55), синему - 1010 1010 (OxAA). Таким образом, каждый канал может содержать любое число в пределах от 0 до 255.
Альфа канал
Сохраненное в виде массива чисел изображение обычно имеет ARGB формат. RGB - соответствуют красному, зеленому и синему каналам, а A - альфа каналу, отвечающему за прозрачность пикселя. Так непрозрачной точке соответствует альфа канал 1111 1111 (OxFF), а прозрачной - 0000 0000 (Ox00). На приведенном ниже рисунке показаны различия между непрозрачными и прозрачными точками.
Приведенный код создает и выводит на экран три ARGB изображения. Особое внимание стоит обратить на заполнение массива точек изображения, в частности на значения Альфа канала, отвечающего за прозрачность.
Метод drawRGB()
Метод drawRGB() появился в MIDP 2.0. Он предназначен для вывода изображений, сохраненных в виде массива пикселей. Метод имеет следующий формат:
Параметры scanlength и processAlpha требуют разъяснения. При выводе изображения на экран система должна знать, сколько точек содержится в строке рисунка. В приведенном выше примере значение scanlength равно 35. Если Вы не хотите использовать прозрачность, то можете не возиться с Альфа каналом точек, а просто установить значение processAlpha в false; в противном случае, processAlpha должно иметь значение true.
Создание ARGB изображения
Давайте с помощью массива точек создадим изображение. Будем рисовать красный шарик размером 10x10 точек.
Прежде чем двигаться дальше, посмотрим, как будет выглядеть изображение, без использования альфа канала. Мы отчетливо видим черный фон вокруг красного шарика.
А вот такого эффекта можно достичь, если определить черные точки как прозрачные.
Чтобы определить размер требуемого массива нужно просто умножить ширину рисунка на его высоту:
Теперь построчно задаем точки рисунка. Не забываем про альфа канал, делая черные точки прозрачными, а все остальные - непрозрачными.
Чтобы вывести это изображение на экран разработчик должен вызвать метод drawRGB() внутри метода paint()
Замечание. Не забывайте устанавливать параметр processAlpha метода drawRGB() в true. В противном случае альфа канал будет игнорироваться, даже если Вы его зададите.
Создание объекта Image из ARGB рисунка
После того как создан и заполнен массив точек, разработчик в любой момент может создать на его основании объект Image и работать с ним как с обычным рисунком.
Иногда бывает просто необходимо иметь именно Image, а не ARGB массив. Например, компоненты ChoiceGroup или List могут отображать рисунки, но только если они представлены Image объектом.
Модификация точек ARGB изображения
Одним из преимуществ использования ARGB массивов - возможность модифицировать изображение прямо в процессе выполнения программы. Приведем простой пример. Будем выводить на экран два изображения одно поверх другого. Второе изображение представлено ARGB массивом. На приведенном ниже рисунке показаны оба изображения.
Итак, сначала ARGB изображение будет непрозрачным, затем с помощью таймера (объект Timer) будем постепенно делать точки прозрачными. Таким образом, расположенное снизу изображение будет постепенно проявляться на экране.
В случае если пользователь нажмет кнопку, все точки верхнего рисунка станут прозрачными и таймер остановится.
DrawRGB_MIDlet.java - главный класс мидлета DrawRGB_Canvas.java - класс создает и выводит на экран рисунокЗаключение
Возможность работать с точками изображения напрямую очень гибкий и мощный инструмент. Надеюсь, Вы сможете значительно улучшить свои приложения, воспользовавшись описанными выше приемами.