ピクセルレベルでビットマップイメージの外観を変更するには、最初に、操作対象の領域にあるピクセルのカラー値を取得する必要があります。 これらのピクセルの値を読み取るには、
getPixel()
メソッドを使用します。
getPixel()
メソッドは、パラメーターとして渡される x, y(ピクセル)座標から RGB 値を取得します。操作対象のピクセルのいずれかに透明度、つまりアルファチャンネルの情報が含まれている場合は、
getPixel32()
メソッドを使用する必要があります。このメソッドは RGB 値も取得しますが、
getPixel()
とは異なり、
getPixel32()
によって返される値には、選択されたピクセルのアルファチャンネル(透明度)値を示す追加データがあります。
または、ビットマップに含まれるピクセルの色または透明度だけを変更するのであれば、
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()
メソッドを使用します。このメソッドは
rect
および
inputByteArray
の 2 つのパラメーターを想定しています。これらのパラメーターを組み合わせて、ピクセルデータ(
inputByteArray
)の矩形領域(
rect
)を出力します。
データが
inputByteArray
から読み取られ、書き込まれると、配列内の各ピクセルに対して
ByteArray.readUnsignedInt()
メソッドが呼び出されます。何らかの理由により、
inputByteArray
に矩形全体に相応するピクセルデータが含まれていない場合は、メソッドはその段階でイメージデータの処理を停止します。
重要な点は、ピクセルデータの取得と設定では、バイト配列は 32 ビットのアルファ、赤、緑、青(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;