引用:http://blog.sina.com.cn/s/blog_6859df3701014w6j.html
其实获取非位图矩形区域只需要一句代码
var notRedBounds:Rectangle = bmd.getColorBoundsRect(0xFF000000, 0x00000000, false);
查了下bitmapdata的API 对这块的解释
getColorBoundsRect | () | 方法 |
public function getColorBoundsRect( mask:uint , color:uint , findColor:Boolean=true): Rectangle
确定矩形区域是将位图图像中指定颜色的所有像素完全包括起来(如果将 findColor 参数设置为 true),还是将不包括指定颜色的所有像素完全包括起来(如果将 findColor 参数设置为 false)。
参数
mask:uint — 一个十六进制值,指定要考虑的 ARGB 颜色的位。 通过使用 &(按位 AND)运算符,将颜色值与此十六进制值合并。
color:uint — 一个十六进制值,指定要匹配(如果 findColor 设置为 true)或不 匹配(如果 findColor 设置为 false)的 ARGB 颜色。
findColor:Boolean (default = true) — 如果该值设置为 true,则返回图像中颜色值的范围。 如果该值设置为 false,则返回图像中不存在此颜色的范围。
返回
Rectangle — 指定颜色的图像区域。
API上的demo用的色值还是RGB,又上网google了一下
首先,我们应该知道 png图是ARGB制式,也就是说出类红绿蓝3通道外还带一alpha的透明通道 一个16进制的通道值大致是0xAARRGGBB 除0x外每两个数代表一组,前两个代表通明通道,ff是最大值,00是最小值,其他3通道一样。
“上边的0xFF000000代表的是透明度最大,0x00000000代表的是完全透明的 通过对 getColorBoundsRect参数的理解 我们知道 mask是一个颜色值合并参数,他会先对bitmapdata的所有像素进行合并,然后根据第二个匹配参数 也就是完全透明的的值进行匹配,最后根据findColor返回匹配的结果, 正果过程就是将bitmapdata的所有像素匹配完全透明值,返回非透明的实际矩形范围。 这样子我们就可以得到我们所需要的实际包图像范围了~ 再来就是扣图, 扣图我们用到BitMapData.threshold() 通过这个方法我们可以很方便排除我们不想要的颜色值来获取我们实际需要的图像”
于是 我修改了一下官方API做了如下测试 注意new bitmapdata的时候 最后一个参数要改成0x00000000 要新建一个完全透明的biamapdata
var bmd:BitmapData = new BitmapData(80, 40, true, 0x00000000);
var rect:Rectangle = new Rectangle(0, 20, 80, 40);
bmd.fillRect(rect, 0xFFFF0000);
var maskColor:uint = 0xFF000000;
var color:uint = 0x00000000;
var redBounds:Rectangle = bmd.getColorBoundsRect(maskColor, color, true);
trace(redBounds); // (x=0, y=0, w=80, h=20) 非透明区域
var notRedBounds:Rectangle = bmd.getColorBoundsRect(maskColor, color,false);
trace(notRedBounds); // (x=0, y=20, w=80, h=20)透明区域
var bm:Bitmap = new Bitmap(bmd);
addChild(bm);
因为新的图像坐标已经偏移,可以通过notRedBounds.x notRedBounds.y 来调整图像位置