2007年09月12日
BitmapData のチャンネル分解
BitmapData.copyChannel の習作。画像をチャンネルごとに分解してみた。左上が赤、右上が緑、左下が青、右下がアルファ。
元の写真の赤いところ(岩)が、赤チャンネルでは白っぽくなってます。空はやはり青チャンネルが白っぽくなってますね。元写真は透過PNGにしてあるので、アルファチャンネルもそれなりに表示されてます。
実装方法はシンプル。赤チャンネルなら元画像の赤チャンネルを RGB それぞれのチャンネルにコピーしています。
ソースはこちら。
package { import flash.display.*; import flash.filters.*; import flash.geom.*; import flash.text.*; public class PngTest extends Sprite { [Embed(source='channel.png')] private var SamplePicture:Class; public function PngTest() { stage.scaleMode = "noScale"; stage.align = "TL"; var icon:Bitmap = new SamplePicture(); addChild(icon); var zeroPoint:Point = new Point(0, 0); var rect:Rectangle = new Rectangle(0, 0, icon.width, icon.height); var channels:Array = [BitmapDataChannel.RED, BitmapDataChannel.GREEN, BitmapDataChannel.BLUE, BitmapDataChannel.ALPHA]; for(var i:int = 0; i < channels.length; i++) { var channel:uint = channels[i]; var bmpdata:BitmapData = new BitmapData(icon.width, icon.height); bmpdata.copyChannel(icon.bitmapData, rect, zeroPoint, channel, BitmapDataChannel.RED); bmpdata.copyChannel(icon.bitmapData, rect, zeroPoint, channel, BitmapDataChannel.GREEN); bmpdata.copyChannel(icon.bitmapData, rect, zeroPoint, channel, BitmapDataChannel.BLUE); var bmp:Bitmap = new Bitmap(bmpdata); bmp.x = (2 + i % 2) * icon.width; bmp.y = Math.floor(i / 2) * icon.height; addChild(bmp); } icon.scaleX = icon.scaleY = 2; } } }