Actionscript 3: Как удалить все черные пиксели из BitmapData? - PullRequest
0 голосов
/ 19 апреля 2010

Допустим, у меня есть BitmapData с различными пикселями, представляющими объект, и несколько черных пикселей вокруг него, которые я хочу удалить.

Я хотел бы получить новые BitmapData с шириной и высотой объекта, представленного не черными пикселями.

Например, допустим, у меня есть BitmapData 400x400px, но объект, представленный не черными пикселями, занимает прямоугольник: x = 100, y = 100, ширина = 200, высота = 200. Я хочу получить новые BitmapData, представляющие этот прямоугольник, все черные пиксели должны быть удалены. Конечно, у меня нет координат для этого прямоугольника, мне нужно каким-то образом провести различие между полным черным растровым изображением и исходным и создать новые растровые данные (разную ширину и высоту).

Есть идеи, как это сделать, пожалуйста?

1 Ответ

5 голосов
/ 19 апреля 2010

Вы можете использовать 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 )
...