0

假设我有一个 BitmapData,它具有代表一个对象的不同像素,以及我想要删除的一些黑色像素。

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

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

请问如何做到这一点?

4

1 回答 1

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

最后,使用 threshold 去除任何剩余的黑色并使其透明:

var blackAlphaColor:uint = 0xFF000000;
var transparentColor:uint = 0x00000000;
littleBmd.threshold( littleBmd, littleBmd.rect, littleBmd.rect.topLeft, "==", blackAlphaColor, transparentColor )
于 2010-04-19T12:26:11.757 回答