Управление пикселами

Flash Player 9 и более поздних версий, Adobe AIR 1.0 и более поздних версий

Класс BitmapData содержит набор методов, позволяющих управлять значениями данных пикселов.

Управление отдельными пикселами

При изменении вида растрового изображения на уровне пикселов необходимо в первую очередь получить значения цветов пикселов в той области, с которой вы хотите работать. Для получения этих значений используйте метод getPixel().

Метод getPixel() возвращает значение RGB по набору координат пиксела x, y, которые передаются как параметр. Если какие-либо пикселы, с которыми вы работаете, содержат прозрачность (альфа-канал), используйте метод getPixel32(). Этот метод также возвращает значение RGB, но в отличие от метода getPixel() значение, возвращаемое getPixel32(), содержит дополнительные данные, представляющие значение альфа-канала (прозрачности) данного пиксела.

Если же вы хотите просто изменить цвет или прозрачность пиксела растрового изображения, воспользуйтесь методом setPixel() или setPixel32(). Для задания цвета пиксела просто передайте координаты x, y и значение цвета одному из этих методов.

В примере ниже показано, как с помощью метода setPixel() нарисовать крестик на зеленом фоне. Затем метод getPixel() возвращает значение цвета пиксела с координатами 50, 50 и отрисовывает его.

import flash.display.Bitmap; 
import flash.display.BitmapData; 
 
var myBitmapData:BitmapData = new BitmapData(100, 100, false, 0x009900); 
 
for (var i:uint = 0; i < 100; i++) 
{ 
    var red:uint = 0xFF0000; 
    myBitmapData.setPixel(50, i, red); 
    myBitmapData.setPixel(i, 50, red); 
} 
 
var myBitmapImage:Bitmap = new Bitmap(myBitmapData); 
addChild(myBitmapImage); 
 
var pixelValue:uint = myBitmapData.getPixel(50, 50); 
trace(pixelValue.toString(16));

Если необходимо считать значение группы пикселов, а не отдельного пиксела, следует использовать метод getPixels(). Этот метод создает массив байтов из прямоугольной области данных пикселов, передаваемых как параметр. Каждый из элементов массива байтов (иными словами, значений пикселов) является целым числом без знака — 32-битным значением пиксела без множителя.

И наоборот, для изменения (или задания) значения группе пикселов используйте метод setPixels(). Этот метод подразумевает наличие двух параметров (rect и inputByteArray), при сочетании которых получается прямоугольная область (rect) данных пикселов (inputByteArray).

По мере чтения (и записи) данных из inputByteArray для каждого пиксела массива вызывается метод ByteArray.readUnsignedInt(). Если по какой-либо причине совокупность значений пикселов в inputByteArray не формирует прямоугольник, метод прекращает обработку, когда обнаруживает это.

Не забывайте, что и для получения, и для установки данных пикселов массив байтов должен иметь значения пикселов альфа, красного, зеленого и синего цветов (ARGB) с глубиной цвета 32 бита.

В следующем примере методы getPixels() и setPixels() используются для копирования группы пикселов из одного объекта BitmapData в другой.

import flash.display.Bitmap; 
import flash.display.BitmapData; 
import flash.utils.ByteArray; 
import flash.geom.Rectangle; 
 
var bitmapDataObject1:BitmapData = new BitmapData(100, 100, false, 0x006666FF); 
var bitmapDataObject2:BitmapData = new BitmapData(100, 100, false, 0x00FF0000); 
 
var rect:Rectangle = new Rectangle(0, 0, 100, 100); 
var bytes:ByteArray = bitmapDataObject1.getPixels(rect); 
 
bytes.position = 0; 
bitmapDataObject2.setPixels(rect, bytes); 
 
var bitmapImage1:Bitmap = new Bitmap(bitmapDataObject1); 
addChild(bitmapImage1); 
var bitmapImage2:Bitmap = new Bitmap(bitmapDataObject2); 
addChild(bitmapImage2); 
bitmapImage2.x = 110;

Обнаружение наложений на уровне пикселов

Метод BitmapData.hitTest() обнаруживает наложения данных растровых изображений на другой объект или точку на уровне пикселов.

Метод BitmapData.hitTest() принимает пять параметров.

  • firstPoint (Point): этот параметр обозначает положение пиксела в левом верхнем углу первого объекта BitmapData, на котором выполняется проверка наложения.

  • firstAlphaThreshold (uint): этот параметр задает максимальное значение альфа-канала, которое соответствует непрозрачному состоянию в данной операции проверки наложения.

  • secondObject (Object): этот параметр обозначает вторую область, участвующую в наложении. Объект secondObject может быть объектом Rectangle, Point, Bitmap или BitmapData. Этот объект представляет собой область, в которой выполняется обнаружение наложения.

  • secondBitmapDataPoint (Point): этот необязательный параметр используется для определения положения пиксела во втором объекте BitmapData. Используйте этот параметр, только если значением secondObject является объект BitmapData. Значение по умолчанию null.

  • secondAlphaThreshold (uint): этот необязательный параметр обозначает максимальное значение альфа-канала, которое соответствует непрозрачному состоянию второго объекта BitmapData. Значение по умолчанию 1. Используйте этот параметр, только когда значением secondObject является BitmapData и оба объекта BitmapData прозрачные.

При обнаружении наложения непрозрачных изображений помните, что ActionScript рассматривает изображение как полностью непрозрачный прямоугольник (или ограничивающий прямоугольник). В то же время при проверке наложения прозрачных изображений на уровне пикселов прозрачными должны быть оба изображения. Кроме того, ActionScript использует параметры порога альфа-канала для определения того, в какой точке пиксел становится из прозрачного непрозрачным.

В примере ниже показано, как создать три растровых изображения и проверить их на наложение пикселов с помощью двух точек наложения (одна возвращает значение false, другая — true).

import flash.display.Bitmap; 
import flash.display.BitmapData; 
import flash.geom.Point; 
 
var bmd1:BitmapData = new BitmapData(100, 100, false, 0x000000FF); 
var bmd2:BitmapData = new BitmapData(20, 20, false, 0x00FF3300); 
 
var bm1:Bitmap = new Bitmap(bmd1); 
this.addChild(bm1); 
 
// Create a red square. 
var redSquare1:Bitmap = new Bitmap(bmd2); 
this.addChild(redSquare1); 
redSquare1.x = 0; 
 
// Create a second red square. 
var redSquare2:Bitmap = new Bitmap(bmd2); 
this.addChild(redSquare2); 
redSquare2.x = 150; 
redSquare2.y = 150; 
 
// Define the point at the top-left corner of the bitmap. 
var pt1:Point = new Point(0, 0); 
// Define the point at the center of redSquare1. 
var pt2:Point = new Point(20, 20); 
// Define the point at the center of redSquare2. 
var pt3:Point = new Point(160, 160); 
 
trace(bmd1.hitTest(pt1, 0xFF, pt2)); // true 
trace(bmd1.hitTest(pt1, 0xFF, pt3)); // false