代码之家  ›  专栏  ›  技术社区  ›  a.s.t.r.o

actionscript3:如何从位图数据中删除所有黑色像素?

  •  0
  • a.s.t.r.o  · 技术社区  · 16 年前

    假设我有一个位图数据,不同的像素代表一个对象,周围有一些黑色的像素我想删除。

    我想获得一个新的位图数据,用非黑色像素表示对象的宽度和高度。

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

    1 回复  |  直到 16 年前
        1
  •  5
  •   jedierikb grijalvaromero    16 年前

    getColorBoundsRect 要查找位图数据中不同颜色像素的尺寸,请执行以下操作:

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

    这将跟踪

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

    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 )
    
    推荐文章