操作像素

Flash Player 9 以及更新的版本,Adobe AIR 1.0 以及更新的版本

BitmapData 類別包含一組方法,可讓您操作像素資料值。

操作個別像素

在像素層級變更點陣圖影像的外觀時,必須先取得包含在您要操作的區域中之像素顏色值。您可以使用 getPixel() 方法來讀取這些像素值。

getPixel() 方法會從一組 x, y (像素) 座標擷取 RGB 值,這些座標是當做參數傳遞。如果想要操作的任何像素包含透明度 (Alpha 色版) 資訊,您就必須使用 getPixel32() 方法。此方法也會擷取 RGB 值,但是與使用 getPixel() 不同的是,getPixel32() 傳回的值還包含其它資料,代表所選取像素的 Alpha 色版 (透明度) 值。

或者,若只要變更包含在點陣圖中的像素顏色或透明度,您可以使用 setPixel()setPixel32() 方法。若要設定像素的顏色,只要將 x, y 座標及顏色值傳遞給下列其中一項方法即可。

下列範例會使用 setPixel() 在綠色的 BitmapData 背景上繪製叉號。然後再使用 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() 方法。此方法需要兩個參數 (rectinputByteArray),結合這兩個參數就能輸出像素資料 (inputByteArray) 的矩形區域 (rect)。

inputByteArray 以外讀取 (和寫入) 資料時,會針對陣列中的每個像素呼叫 ByteArray.readUnsignedInt() 方法。基於某些原因,如果 inputByteArray 不包含完整矩形的像素資料,該方法就會停止處理在該點的影像資料。

因此,請務必記住在取得和設定像素資料時,位元組陣列需要 32 位元的 Alpha、紅色、綠色、藍色 (ARGB) 像素值。

下列範例會使用 getPixels()setPixels() 方法,將一組像素從某個 BitmapData 物件複製到另一個 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):此參數指定會在此碰撞測試中視為不透明的最高 Alpha 色版值。

  • secondObject (Object):此參數代表影響的區域。secondObject 物件可以是 Rectangle、Point、Bitmap 或 BitmapData 物件。此物件代表執行衝突偵測的作用區域。

  • secondBitmapDataPoint (Point):此選擇性參數可以用來在第二個 BitmapData 物件中定義像素位置。只有在 secondObject 的值是 BitmapData 物件時,才會使用此參數。預設值是 null

  • secondAlphaThreshold (uint):此選擇性參數代表在第二個 BitmapData 物件中視為不透明的最高 Alpha 色版值。預設值為 1。只有當 secondObject 的值為 BitmapData 物件,而且兩個 BitmapData 物件都為透明時,才能使用此參數。

針對不透明的影像執行衝突偵測時,請記住 ActionScript 會將影像視為彷彿它是完全不透明的矩形 (或是範圍框)。或者,針對透明的影像執行像素層級碰撞測試時,這兩個影像都必須是透明的。除此之外,ActionScript 還會使用 Alpha 臨界值參數,決定在哪一點像素會從透明變成不透明。

下列範例會建立三個點陣圖影像,並使用兩個不同的衝突點 (一個會傳回 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