Ändra pixlar

Flash Player 9 och senare, Adobe AIR 1.0 och senare

Klassen BitmapData innehåller en serie metoder som du använder för att ändra pixeldatavärden.

Ändra individuella pixlar

När du ändrar utseendet på en bitmappsbild på pixelnivå, måste du först hämta färgvärdena för pixlarna inom det område som du vill ändra. Använd metoden getPixel() för att läsa dessa pixelvärden.

Med metoden getPixel() hämtas ett RGB-värde från en serie x-, y-koordinater (pixel) som skickats som parametrar. Om någon av de pixlar du vill ändra innehåller genomskinlighetsinformation (alfakanal) måste du använda metoden getPixel32() . Metoden hämtar också ett RGB-värde, men det värde som returneras med getPixel() innehåller, i motsats till det värde som hämtas med getPixel32() ytterligare data som representerar alfakanalsvärdet (genomskinlighet) för de valda pixlarna.

Om du bara vill ändra färg eller genomskinlighet på en pixel som finns i en bitmapp, kan du använda metoden setPixel() eller setPixel32() . Om du vill ange en pixels färg skickar du x-, y-koordinaterna och färgvärdet till någon av dessa metoder.

I följande exempel används setPixel() för att rita ett kors på en grön BitmapData-bakgrund. Därefter används getPixel() för att hämta färgvärdet från pixeln på koordinaten 50, 50, och det returnerade värdet kalkeras.

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

Om du vill läsa värdet för en grupp pixlar, i motsats till en enstaka pixel, använder du metoden getPixels() . Med den här metoden genereras en byte-array från ett rektangulärt område med pixeldata som skickats som en parameter. Varje element i byte-arrayen (alltså pixelvärdena) är heltal utan tecken, 32-bitars icke-multiplicerade pixelvärden.

Om du omvänt vill ändra (eller ange) värdet för en grupp pixlar använder du metoden setPixels() . Den här metoden förväntar sig två parametrar ( rect och inputByteArray ) som kombineras för att mata ut ett rektangulärt område ( rect ) av pixeldata ( inputByteArray ).

När data läses (och skrivs) från inputByteArray anropas metoden ByteArray.readUnsignedInt() för varje pixel i arrayen. Om inputByteArray av någon anledning inte innehåller ett fullständigt rektangelvärde med pixeldata, stoppas hanteringen av bilddata av metoden.

Kom ihåg att byte-arrayen förväntar sig 32-bitars alfa, röd, grön, blå (ARGB) både vid hämtning och inställning av pixeldata.

I följande exempel används metoderna getPixels() och setPixels() för att kopiera pixlar mellan olika BitmapData-objekt:

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;

Kollisionsidentifiering på pixelnivå

Med metoden BitmapData.hitTest() identifieras kollisioner på pixelnivå mellan bitmappsdata och andra objekt eller punkter.

Metoden BitmapData.hitTest() godkänner fem parametrar:

  • firstPoint (Point): Den här parametern refererar till pixelpositionen för det övre vänstra hörnet av den första BitmapData på vilket träfftestet utförs.

  • firstAlphaThreshold (uint): Den här parametern anger det högsta alfakanalsvärdet som räknas som ogenomskinligt för det här träfftestet.

  • secondObject (Object): Den här parametern representerar effektområdet. Objektet secondObject kan vara ett Rectangle-, Point-, Bitmap- eller BitmapData-objekt. Det här objektet representerar träffområdet som kollisionsidentifieringen utförs på.

  • secondBitmapDataPoint (Point): Den här valfria parametern används för att definiera en pixelplats i det andra BitmapData-objektet. Parametern används bara om värdet för secondObject är ett BitmapData-objekt. Standardvärdet är null .

  • secondAlphaThreshold (uint): Den här valfria parametern representerar det högsta alfakanalsvärdet som räknas som ogenomskinligt i det andra BitmapData-objektet. Standardvärdet är 1. Den här parametern används bara när värdet för secondObject är ett BitmapData-objekt och båda BitmapData-objekten är genomskinliga.

När du utför en kollisionsidentifiering på ogenomskinliga bilder bör du tänka på att ActionScript hanterar bilden som om den är en fullständigt ogenomskinlig rektangel (eller begränsningsram). När du utför ett träfftest på genomskinliga bilder måste båda bilderna vara genomskinliga. ActionScript använder dessutom alfatröskelparametrarna för att bestämma vid vilken punkt pixlarna ska ändras från genomskinliga till ogenomskinliga.

I följande exempel skapas tre bitmappsbilder och eftersöks pixelkollisioner med hjälp av två olika kollisionspunkter (en returnerar false och en annan 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