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

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