Pixels bewerken

Flash Player 9 of hoger, Adobe AIR 1.0 of hoger

De klasse BitmapData bevat een set methoden waarmee u pixelgegevenswaarden kunt bewerken.

Afzonderlijke pixels bewerken

Wanneer u de weergave van een bitmapafbeelding op pixelniveau wilt wijzigen, moet u eerst de kleurwaarden ophalen van de pixels in het gebied dat u wilt bewerken. U gebruikt de methode getPixel() om deze pixelwaarden te lezen.

Met de methode getPixel() wordt een RGB-waarde opgehaald uit een set x- en y-(pixel)coördinaten die worden doorgegeven als een parameter. Als een van de pixels die u wilt bewerken transparantiegegevens (alfakanaal) bevat, moet u de methode getPixel32() gebruiken. Met deze methode wordt ook een RGB-waarde opgehaald, maar in tegenstelling tot met getPixel(), bevat de door getPixel32() geretourneerde waarde aanvullende gegevens met betrekking tot de alfakanaalwaarde (transparantie) van de geselecteerde pixel.

Als u slechts de kleur of transparantie van een pixel in een bitmap wilt wijzigen, kunt u de methode setPixel() of setPixel32() gebruiken. U stelt de kleur van een pixel in door de x- en y-coördinaten en de kleurwaarde door te geven aan een van deze methoden.

In het volgende voorbeeld wordt setPixel() gebruikt om een kruis op een groene BitmapData-achtergrond te tekenen. Vervolgens wordt getPixel() gebruikt om de kleurwaarde van de pixel op coördinaat 50, 50 op te halen en de geretourneerde waarde te traceren.

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

Gebruik de methode getPixels() als u niet de waarde van één pixel, maar die van een groep pixels wilt lezen. Deze methode genereert een bytearray op basis van een rechthoekig gebied met pixelgegevens dat wordt doorgegeven als een parameter. Alle elementen van de bytearray (de pixelwaarden) zijn gehele getallen zonder teken: 32-bits niet-vermenigvuldigde pixelwaarden.

Wanneer u de waarde van een groep pixels wilt instellen of wijzigen, gebruikt u de methode setPixels(). Deze methode verwacht twee parameters (rect en inputByteArray) die worden gecombineerd om een rechthoekig gebied (rect) met pixelgegevens (inputByteArray) te produceren.

Terwijl gegevens worden gelezen (en geschreven) uit inputByteArray, wordt de methode ByteArray.readUnsignedInt() aangeroepen voor elk van de pixels in de array. Als inputByteArray om welke reden dan ook niet een volledige rechthoek aan pixelgegevens bevat, worden de afbeeldingsgegevens niet meer verwerkt.

Voor het ophalen en instellen van pixelgegevens verwacht de bytearray 32-bits ARGB-pixelwaarden.

In het volgende voorbeeld worden de methoden getPixels() en setPixels() gebruikt om een groep pixels van het ene naar het andere object BitmapData te kopiëren:

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;

Botsingdetectie op pixelniveau

Met de methode BitmapData.hitTest() wordt botsingdetectie op pixelniveau uitgevoerd tussen de bitmapgegevens en een ander object of punt.

De methode BitmapData.hitTest() accepteert vijf parameters:

  • firstPoint (Point): deze parameter verwijst naar de pixelpositie van de linkerbovenhoek van het eerste object BitmapData waarop de detectietest wordt uitgevoerd.

  • firstAlphaThreshold (uint): met deze parameter wordt de hoogste alfakanaalwaarde opgegeven die voor deze detectietest als dekkend wordt beschouwd.

  • secondObject (Object): deze parameter vertegenwoordigt het betrokken gebied. secondObject kan een object Rectangle, Point, Bitmap of BitmapData zijn. Dit object staat voor het raakgebied waarin de botsingdetectie wordt uitgevoerd.

  • secondBitmapDataPoint (Point): deze optionele parameter wordt gebruikt om een pixellocatie in het tweede object BitmapData te definiëren. Deze parameter wordt alleen gebruikt wanneer de waarde van secondObject een object BitmapData is. De standaardwaarde is null.

  • secondAlphaThreshold (uint): deze optionele parameter vertegenwoordigt de hoogste alfakanaalwaarde die in het tweede object BitmapData als dekkend wordt beschouwd. De standaardwaarde is 1. Deze parameter wordt alleen gebruikt wanneer de waarde van secondObject een object BitmapData is en beide BitmapData-objecten transparant zijn.

Wanneer u botsingdetectie uitvoert voor dekkende afbeeldingen, worden deze in ActionScript beschouwd als volledig dekkende rechthoeken (of selectiekaders). Wanneer u een detectietest op pixelniveau wilt uitvoeren voor transparante afbeeldingen, moeten beide afbeeldingen transparant zijn. Daarnaast gebruikt ActionScript de parameters voor de alfadrempel om te bepalen op welk punt de pixels niet meer transparant zijn, maar dekkend.

In het volgende voorbeeld worden drie bitmapafbeeldingen gemaakt en wordt op twee verschillende punten gecontroleerd of er pixelbotsingen optreden (met als resultaten een keer false en een keer 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