天天看點

位圖處理

其實擷取非位圖矩形區域隻需要一句代碼

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 來調整圖像位置

繼續閱讀