Piksellerde değişiklik yapma

Flash Player 9 ve üstü, Adobe AIR 1.0 ve üstü

BitmapData sınıfı, piksel veri değerlerini değiştirmenize imkan tanıyan bir dizi yöntem içerir.

Piksellerde tek tek değişiklik yapma

Bir bitmap görüntünün görünümünü piksel düzeyinde değiştirirken, öncelikle değişiklik yapmak istediğiniz alandaki piksellerin renk değerlerini bilmeniz gerekir. Bu piksel değerleri getPixel() yöntemi ile okunur.

getPixel() yöntemi parametre olarak iletilen x, y (piksel) koordinatları kümesinden bir RGB değeri alır. Değişiklik yapmak istediğiniz piksellerden herhangi biri saydamlık (alfa kanalı) bilgisi içeriyorsa, getPixel32() yöntemini kullanmanız gerekir. Bu yöntem de bir RGB değeri alır ancak getPixel() yönteminden farklı olarak getPixel32() sonucunda dönen değer seçilen pikselin alfa kanalını (saydamlığını) temsil eden ek veri içerir.

Ayrıca, bir bitmap içerisinde bulunan piksellerden herhangi birinin rengini veya saydamlık değerini değiştirmek isterseniz, setPixel() veya setPixel32() yöntemini kullanabilirsiniz. Bir pikselin rengini ayarlamak için, bu yöntemlerden birine x, y koordinatlarını ve renk değerini iletin.

Aşağıdaki örnek yeşil bir BitmapData arka planı üzerine bir artı çizmek için setPixel() yöntemini kullanır. Ardından 50, 50 koordinatlarında bulunan pikselden renk değerini almak için getPixel() yöntemini kullanır ve dönen değeri izler.

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));

Tek bir piksel yerine bir piksel grubunun değerini okumak isterseniz, getPixels() yöntemini kullanın. Bu yöntem bir parametre olarak iletilen piksel verilerinin dikdörtgen bölgesinden bir bayt dizisi oluşturur. Bayt dizisinin (başka bir deyişle piksel değerlerinin) öğelerinden her biri birer işaretsiz tam sayı - 32-bit, çarpılmamış piksel değeridir.

Bir piksel grubunun değerini değiştirmek (veya belirlemek) için ise setPixels() yöntemini kullanın. Bu yöntem dikdörtgen şeklinde (rect) bir piksel verisi (inputByteArray) çıktısı oluşturmak için birleştirilen iki parametre (rect ve inputByteArray) bekler.

Veriler inputByteArray içerisinden okunduğu (ve içerisine yazıldığı) için ByteArray.readUnsignedInt() yöntemi dizi içindeki piksellerin her biri için çağrılır. Herhangi bir nedenden dolayı inputByteArray piksel değerine eşdeğer tam bir dikdörtgen içermezse, yöntem görüntü verisi işlemeyi o noktada durdurur.

Piksel verisini alırken ve ayarlarken bayt dizisinin 32-bit alfa, kırmızı, yeşil ve mavi (ARGB) piksel değerlerini beklediği unutulmamalıdır.

Aşağıdaki örnek, bir BitmapData nesnesindeki piksel grubunu başka bir BitmapData nesnesine kopyalamak için getPixels() ve setPixels() yöntemlerini kullanır:

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;

Piksel düzeyinde çakışma saptama

BitmapData.hitTest() yöntemi bitmap verileri ile başka bir nesne veya nokta arasında piksel düzeyinde çakışma saptaması gerçekleştirir.

BitmapData.hitTest() yöntemi beş parametre kabul eder:

  • firstPoint (Point): Bu parametre ilk BitmapData'nın vuruş testinin gerçekleştirildiği sol üst köşesinin piksel konumudur.

  • firstAlphaThreshold (uint): Bu parametre, bu vuruş testi için opak olarak kabul edilen en yüksek alfa kanalı değerini belirtir.

  • secondObject (Object): Bu parametre etki alanını temsil eder. secondObject nesnesi Rectangle, Point, Bitmap veya BitmapData nesnesi olabilir. Bu nesne, gerçekleştirilen çakışma saptamanın vuruş alanını temsil eder.

  • secondBitmapDataPoint (Point): İsteğe bağlı olan bu parametre ikinci BitmapData nesnesinde bir piksel konumunu tanımlamak için kullanılır. Bu parametre yalnızca secondObject değeri bir BitmapData nesnesi olduğunda kullanılır. Varsayılan değer null şeklindedir.

  • secondAlphaThreshold (uint): İsteğe bağlı bu parametre ikinci BitmapData nesnesinde opak olarak kabul edilen en yüksek alfa kanalı değerini temsil eder. Varsayılan değer 1'dir. Bu parametre yalnızca secondObject değeri bir BitmapData nesnesi olduğunda ve her iki BitmapData nesnesi de saydam olduğunda kullanılır.

Opak görüntülerde çakışma saptama gerçekleştirirken, ActionScript'in görüntüyü tamamen opak bir dikdörtgen (veya sınırlama kutusu) olarak değerlendirdiğini unutmayın. Ayrıca, saydam görüntülerde piksel düzeyinde vuruş testi yaparken her iki görüntünün de saydam olması gerekir. Buna ek olarak, ActionScript piksellerin hangi noktada saydamlıktan opaklığa geçiş yaptığını belirlemek için alfa eşiği parametrelerini kullanır.

Aşağıdaki örnek üç bitmap görüntüsü oluşturur ve iki farklı çakışma noktası kullanarak piksel çarpışmalarını kontrol eder. (Biri false diğeri true değeri verir.)

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