Bearbeiten von Pixelwerten

Flash Player 9 und höher, Adobe AIR 1.0 und höher

Die BitmapData-Klasse enthält mehrere Methoden zum Bearbeiten von Pixeldatenwerten.

Bearbeiten einzelner Pixel

Beim Ändern der Darstellung eines Bitmapbilds auf Pixelebene müssen Sie zunächst die Farbwerte der Pixel in dem zu bearbeitenden Bereich abrufen. Die entsprechenden Pixelwerte können mithilfe der getPixel() -Methode gelesen werden.

Mit der getPixel() -Methode wird ein RGB-Wert für ein x- und y-Koordinatenpaar (Pixel) abgerufen, das als Parameter übergeben wird. Wenn die zu bearbeitenden Pixel Transparenzinformationen (Alphakanal) enthalten, muss die getPixel32() -Methode verwendet werden. Mit dieser Methode wird ebenfalls ein RGB-Wert abgerufen. Im Gegensatz zu getPixel() enthält der von getPixel32() zurückgegebene Wert jedoch zusätzliche Daten, mit denen der Wert des Alphakanals (Transparenz) des ausgewählten Pixels angegeben wird.

Wenn Sie dagegen lediglich die Farbe oder die Transparenz eines Pixels in einer Bitmap ändern möchten, können Sie die setPixel() -Methode oder die setPixel32() -Methode verwenden. Übergeben Sie zum Festlegen der Farbe eines Pixels die x- und die y-Koordinate sowie den Farbwert an eine dieser Methoden.

Im folgenden Beispiel wird mithilfe von setPixel() ein Kreuz auf einem grünen BitmapData-Hintergrund gezeichnet. Anschließend werden mit getPixel() der Farbwert des Pixels an der Koordinate (50, 50) abgerufen und der zurückgegebene Wert ausgegeben.

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

Verwenden Sie die getPixels() -Methode, wenn Sie anstelle eines einzelnen Pixelwerts den Wert einer Pixelgruppe abrufen möchten. Mit dieser Methode wird ein Byte-Array eines rechteckigen Bereichs von Pixeldaten erstellt, das als Parameter übergeben wird. Alle Elemente des Byte-Arrays (d. h. die einzelnen Pixelwerte) sind vorzeichenlose 32-Bit-Ganzzahlen und nicht multiplizierte Farbwerte.

Wenn Sie im Gegensatz dazu den Wert einer Pixelgruppe ändern (oder festlegen) möchten, verwenden Sie die setPixels() -Methode. Bei dieser Methode müssen zwei Parameter ( rect und inputByteArray ) angegeben werden, die zur Ausgabe eines rechteckigen Bereichs ( rect ) von Pixeldaten ( inputByteArray ) kombiniert werden.

Beim Lesen (und Schreiben) von Daten in inputByteArray wird die ByteArray.readUnsignedInt() -Methode für alle Pixel im Array aufgerufen. Wenn das inputByteArray aus bestimmten Gründen kein vollständiges Rechteck mit Pixeldaten enthält, wird die Verarbeitung der Bilddaten an der entsprechenden Position abgebrochen.

Bedenken Sie dabei immer, dass beim Abrufen und Festlegen von Pixeldaten für das Byte-Array 32-Bit-Pixelwerte für Alpha, Rot, Grün und Blau (ARGB) angegeben werden müssen.

Im folgenden Beispiel wird mithilfe der Methoden getPixels() und setPixels() eine Gruppe von Pixeldaten von einem BitmapData-Objekt in ein anderes BitmapData-Objekt kopiert:

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;

Kollisionserkennung auf Pixelebene

Mit der BitmapData.hitTest() -Methode wird eine Kollisionserkennung auf Pixelebene zwischen den Bitmapdaten und einem anderen Objekt oder Punkt durchgeführt.

Bei der BitmapData.hitTest() -Methode können die folgenden fünf Parameter angegeben werden:

  • firstPoint (Point): Dieser Parameter verweist auf die Pixelposition der linken oberen Ecke des ersten BitmapData-Objekts, anhand dessen die Kollisionserkennung durchgeführt wird.

  • firstAlphaThreshold (uint): Mit diesem Parameter wird der höchste Alphakanalwert angegeben, der bei der Kollisionserkennung als undurchsichtig ausgewertet wird.

  • secondObject (Object): Dieser Parameter stellt den Kollisionsbereich dar. Beim secondObject -Objekt kann es sich um ein Rectangle-, Point-, Bitmap- oder BitmapData-Objekt handeln. Mit diesem Objekt wird der Kollisionsbereich angegeben, für den die Kollisionserkennung durchgeführt wird.

  • secondBitmapDataPoint (Point): Mit diesem optionalen Parameter wird die Position eines Pixels im zweiten BitmapData-Objekt angegeben. Dieser Parameter wird nur verwendet, wenn der Wert des secondObject -Objekts ein BitmapData-Objekt ist. Der Standardwert ist null .

  • secondAlphaThreshold (uint): Mit diesem optionalen Parameter wird der höchste Alphakanalwert angegeben, der im zweiten BitmapData-Objekt als undurchsichtig ausgewertet wird. Der Standardwert ist 1. Dieser Parameter wird nur verwendet, wenn der Wert von secondObject ein BitmapData-Objekt ist und beide BitmapData-Objekte Transparenzinformationen enthalten.

Denken Sie beim Durchführen der Kollisionserkennung für undurchsichtige Bilder daran, dass das Bild in ActionScript so verarbeitet wird, als handle es sich um vollständig undurchsichtige Rechtecke (oder Begrenzungsfelder). Beim Durchführen der Kollisionserkennung auf Pixelebene bei Bildern mit Transparenz müssen dagegen beide Bilder Transparenzinformationen enthalten. Darüber hinaus wird in ActionScript mithilfe der Parameter für den Alphaschwellenwert ermittelt, an welchem Punkt Pixel von transparent in undurchsichtig übergehen.

Im folgenden Beispiel werden drei Bitmapbilder erstellt. Anschließend wird eine Kollisionserkennung mit zwei verschiedenen Kollisionspunkten durchgeführt (ein Kollisionspunkt gibt „false“ zurück, der andere „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