Actionscript 3:如何从BitmapData中删除所有黑色像素?

时间:2010-04-19 12:01:21

标签: actionscript-3 bitmapdata

假设我有一个BitmapData,其中不同的像素代表一个对象,并且我想要删除它周围的一些黑色像素。

我想获得一个新的BitmapData,其对象的宽度和高度由非黑色像素表示。

例如,假设我有一个BitmapData 400x400px,但由非黑色像素表示的对象占据矩形:x = 100,y = 100,width = 200,height = 200。我想获得表示该rect的新BitmapData,应删除所有黑色像素。当然,我没有该矩形的坐标,我需要以某种方式在完整的黑色位图数据和原始位图数据之间做出区别,并构造一个新的位图数据(不同的宽度和高度)。

请问如何做到这一点?

1 个答案:

答案 0 :(得分:5)

您可以使用getColorBoundsRect查找BitmapData中不同颜色像素的尺寸:

//some fake data
var yourBigBmd:BitmapData = new BitmapData( 300, 300, false, 0 );
yourBigBmd.fillRect( new Rectangle( 10, 10, 30, 60 ), 0xFF0000 );
//a little notch
yourBigBmd.fillRect( new Rectangle( 10, 10, 10, 10), 0x00000 );

var blackColor:uint = 0x000000;
var littleBmdBounds:Rectangle = yourBigBmd.getColorBoundsRect( 0xFFFFFF, blackColor, false );
trace( "littleBmdBounds: " + littleBmdBounds );

这将追踪 littleBmdBounds :( x = 10,y = 10,w = 30,h = 60)

接下来,我们需要将这些边界中的内容复制到新的BitmapData中:

var littleBmd:BitmapData = new BitmapData( littleBmdBounds.width, littleBmdBounds.height, true, 0 );
var mx:Matrix = new Matrix();
mx.translate( -littleBmdBounds.x, -littleBmdBounds.y );
littleBmd.draw( yourBigBmd, mx );

最后,使用阈值删除任何剩余的黑色并使其透明:

var blackAlphaColor:uint = 0xFF000000;
var transparentColor:uint = 0x00000000;
littleBmd.threshold( littleBmd, littleBmd.rect, littleBmd.rect.topLeft, "==", blackAlphaColor, transparentColor )