Bitmap和BitmapData
2010.5.25 smartblack整理
一、flash.display.Bitmap類及其兩個子類
1、繼承自DisplayObject,和InteractiveObject平級,所以無法調度鼠標事件,可以使用額外的包裝容器(Sprite)來實現偵聽。
2、只支持GIF、JPEG、PNG格式,不支持BMP(網上已有解決方法)
3、構造函數:?Bitmap(bitmapData:BitmapData = null, pixelSnapping:String = "auto", smoothing:Boolean = false),pixelSnapping是自動緊貼,smoothing是平滑處理
4、Bitmap類的子類mx.core.FlexBitmap:覆蓋了toString(),用于指示對象在應用程序的DisplayObject層次結構中所處的位置。
5、FlexBitmap的子類mx.core.BitmapAsset:實現了IFlexAsset、IFlexDisplayObject接口。在FLEX應用程序中,通常不必直接使用此類,MXML編譯器會自動生成,比如:
<mx:Image id = “logo” source = “@Embed(source = ‘Logo.gif’)”/>
不過,在AS級別,則可以對圖片進行更多的操作(比如使用BitmapData類的一些方法):
[Bindable]
[Embed(source = “Logo.gif”)]
private var logoClass:Class;
var logo:BitmapAsset = BitmapAsset(new logoClass());
logo.bitmapData.noise(4);
<mx:Image id = “logo” source = “{logoClass}”/>
?
二、flash.display.BitmapData類及常用類方法簡介
1、繼承自Object,可以看作一個專門用來存儲位圖像素點陣信息的數組。比如大小100x100的位圖,其BitmapData就相當于一個100x100的二維數組,對應存儲了10000像素的顏色值。這個顏色值是一個32位的ARGB值,用uint整數類型表示,即alpha 和red green blue 三原色。0xFF669900代表不透明的橙色,其中FF表示16進制的最大數,alpha值的范圍也就在0x00-0xFF之間,比如十六進制80就是十進制的128,也就是透明度256的一半。
2、構造函數:BitmapData(width:int, height:int, transparent:Boolean = true,fillColor:unit = 0xFFFFFFFF),width?和?height?參數指定位圖的大小,二者的最大值都是 2880 像素。transparent是透明度,設置為false時,顏色值僅使用24位的RGB值,這可以略微提升呈現性能。但需要注意的是,設置為不透明位圖后,將無法再更改為透明位圖。fillColor是用于填充位圖區域的?32?位?ARGB?顏色值,默認為0xFFFFFFFF(純白色)。
3、像素處理(參考http://www.skill8.net/article.asp?id=15)
處理單個像素: 獲取要處理的區域中包含的像素的顏色值。使用 getPixel() 方法可讀取這些單個的像素值。 getPixel() 方法從作為參數傳遞的一組 x, y(像素)坐標中檢索 RGB 值。 getPixel32() 返回的值包含表示所選像素的 Alpha 通道(透明度)值的附加數據。 同理設置單個像素: 如果只想更改位圖中包含的某個像素的顏色或透明度,則可以使用 setPixel() 或 setPixel32() 方法。若要設置像素的顏色,只需將 x, y 坐標和顏色值傳遞到這兩種方法之一即可。?
設置某個區域請使用 getPixels() 方法。此方法從作為參數傳遞的矩形像素數據區域中生成字節數組。字節數組的每個元素(即像素值)都是無符號的整數(32 位未經相乘的像素值)。 相反,為了更改(或設置)一組像素值,請使用 setPixels() 方法。此方法需要聯合使用兩個參數(rect 和 inputByteArray)來輸出像素數據 (inputByteArray) 的矩形區域 (rect)。 從 inputByteArray 中讀取(或寫入)數據時,會為數組中的每個像素調用 ByteArray.readUnsignedInt() 方法。如果由于某些原因,inputByteArray 未包含像素數據的整個矩形,則該方法會停止處理該點處的圖像數據。 必須記住的是,對于獲取和設置像素數據,字節數組需要有 32 位 Alpha、紅、綠、藍 (ARGB) 像素值。?
4、像素級別沖突檢測
這個有什么用?我有一個對象需要判斷是否和PNG圖片碰撞,但是PNG圖片的邊緣是透明的時候,這個就有用了。
BitmapData.hitTest() 方法可以在位圖數據和另一個對象或點之間執行像素級別沖突檢測。
?
hitTest(firstPoint:Point, firstAlphaThreshold:uint, secondObject:Object, secondBitmapDataPoint:Point = null, secondAlphaThreshold:uint = 1):Boolean
?
firstPoint (Point):此參數指在其上執行點擊測試的第一個 BitmapData 的左上角的像素位置。
firstAlphaThreshold (uint):此參數指定對于此點擊測試視為不透明的最高 Alpha 通道值。
secondObject (Object):此參數表示影響區域。secondObject 對象可以是 Rectangle、Point、Bitmap 或 BitmapData 對象。此對象表示在其上執行沖突檢測的點擊區域。
secondBitmapDataPoint (Point):此可選參數用于在第二個 BitmapData 對象中定義像素位置。只有當 secondObject 的值為 BitmapData 對象時,才使用此參數。默認值為 null。
secondAlphaThreshold (uint):此可選參數表示在第二個 BitmapData 對象中視為不透明的最高 Alpha 通道值。默認值為 1。只有當 secondObject 是一個 BitmapData 對象且兩個 BitmapData 對象都透明時,才使用此參數。
5、applyFilter添加濾鏡、fillRect使用指定顏色填充一個矩形像素區域
http://hi.baidu.com/%B0%B5%BA%DA%B2%E0%CE%C0/blog/item/cb78f89bae3558bcc9eaf401.html
6、draw(source:IBitmapDrawable, matrix:Matrix = null, colorTransform:ColorTransform = null, blendMode:String = null, clipRect:Rectangle = null, smoothing:Boolean = false):void
將source對象繪制到BitmapData對象里。其中,DisplayObject和BitmapData類實現了IBitmapDrawable接口。clipRect是對源對象的裁剪,不指定則會繪制整個源對象。另外,注意跨域的問題。
應用:保存圖片,保存當前屏幕顯示內容等。參考http://wangcheng.iteye.com/blog/129007
?
7、getColorBoundsRect(mask:uint, color:uint, findColor:Boolean = true):Rectangle
mask:uint一個十六進制值,指定要考慮的 ARGB 顏色的位。通過使用 &(按位 AND)運算符,將顏色值與此十六進制值合并。
color:uint一個十六進制值,指定要匹配(如果 findColor 設置為 true)或不 匹配(如果 findColor 設置為 false)的 ARGB 顏色。
findColor:Boolean (default = true)如果該值設置為 true,則返回圖像中顏色值的范圍。如果該值設置為 false,則返回圖像中不存在此顏色的范圍。
應用:獲得一個DisplayObject的真實寬高(去除透明部分)
function getRealWH(source:DisplayObject):Rectangle{
copy = new BitmapData(source.width,source.height,false,0xFF0000);
copy.draw(source);
return copy.getColorBoundsRect(0xFFFFFF,0xFF0000,false);
}
具體思路就是,將BitmapData背景設為紅色,將source對象draw上去,然后獲取非紅色部分的邊框。
8、同一個BitmapData對象可能被多個Bitmap對象持有,那么一旦BitmapData改變,所有的Bitmap對象都將受到影響,為了避免這種情況,可以用BitmapData對象提供的clone()方法生成當前BitmapData對象的拷貝。
?
三、Bitmap和BitmapData的綜合描述
1、將Bitmap位圖對象和BitmapData位圖信息分開,是為了讓位圖呈現操作與Flash Player的內部顯示更新例程分隔開來,不會因為連續的繪制導致額外的每幀開銷。
2、當應用程序需要將位圖圖像保存到本地或發送到服務端時, 通常的方法是在發送數據前將圖像通過PNG或JPEG編碼。如果只是想保存位圖圖像,只要序列化BitmapData即可,將圖像轉換為 JPEG/PNG是完全沒有必要的。參見[AS3]Bitmap序列化(將BitmapData保存為原生Binary/ByteArray)
地址:http://space.flash8.net/space/?388361/viewspace-468245.html
?
四、附記
1、位圖與矢量圖的概念及區別?
矢量圖(vector):矢量圖形是以數學方式生成的幾何形狀,這些圖形的元素是一些點、線、矩形、多邊形、圓和弧線等等,它們都是通過數學公式計算獲得的。眾所周知Flash就是一款矢量動畫制作軟件。在AS中使用的填充(beginFill),畫線(lineTo)等命令都是基于對矢量圖的操作。
位圖(Bitmap):位圖圖形也稱為光柵圖形,由排列為矩形網格形式的小方塊(像素)組成。簡單地說,位圖就是以無數的色彩點組成的圖案。?兩者比較:
矢量圖可以無限放大,而且不會失真; 而位圖會失真。
位圖由像素組成而矢量圖由矢量線組成。
位圖可以表現的色彩比較多;而矢量圖則相對較少。
矢量圖體積小,但比較消耗計算資源;位圖則比較消耗內存資源,但對計算資源消耗小。
?
位圖圖像用圖像的寬度和高度來定義,以像素為量度單位,每個像素包含的位數表示像素包含的顏色數。在使用?RGB?顏色模型的位圖圖像中,像素由三個字節組成:紅、綠和藍。每個字節包含一個?0?至?255?之間的值。將字節與像素合并時,它們可以產生與藝術混合繪畫顏色相似的顏色。例如,一個包含紅色字節值?255、綠色字節值?102?和藍色字節值?0?的像素可以形成明快的橙色。
位圖圖像的品質由圖像分辨率和顏色深度位值共同確定。分辨率與圖像中包含的像素數有關。像素數越大,分辨率越高,圖像也就越精確。顏色深度又叫色彩位數,與像素可包含的信息量有關。即位圖中要用多少個二進制位來表示每個點的顏色,是分辨率的一個重要指標。常用有1位(單色),2位(4色,CGA),4位(16色,VGA),8位(256色),16位(增強色),24位和32位(真彩色)等。色深16位以上的位圖還可以根據其中分別表示RGB三原色或CMYK四原色(有的還包括Alpha通道,CMYK四原色指打印顏色)的位數進一步分類 例如,顏色深度值為每像素?16?位的圖像無法顯示顏色深度為?48?位的圖像所具有顏色數。因此,48?位圖像與?16?位圖像相比,其陰影具有更高的平滑度。
由于位圖圖形跟分辨率有關,因此不能很好地進行縮放。當放大位圖圖像時,這一特性顯得尤為突出。通常,放大位圖有損其細節和品質。
2、三種圖形格式說明
Adobe Flash Player?支持GIF、JPG?和?PNG三種位圖圖像格式 。對于使用GIF和?PNG的位圖圖像還可以對每個像素添加一個額外的字節——Alpha通道,表示像素的透明度值。
GIF
圖形交換格式 (GIF) 最初由 CompuServe 于 1987 年開發,作為一種傳送 256 色(8 位顏色)圖像的方式。此格式提供較小的文件大小,是基于 Web 的圖像的理想格式。受此格式的調色板所限,GIF 圖像通常不適用于照片,照片通常需要高度的陰影和顏色漸變。GIF 圖像允許產生一位透明度,允許將顏色映射為清晰(或透明)。這可以使網頁的背景顏色通過已映射透明度的圖像顯示出來。
JPEG
由聯合圖像專家組 (JPEG) 開發,JPEG(通常寫成 JPG)圖像格式使用有損壓縮算法允許24 位顏色深度具有很小的文件大小。有損壓縮意味著每次保存圖像,都會損失圖像品質和數據,但會生成更小的文件大小。由于 JPEG 能夠顯示數百萬計的顏色,因此它是照片的理想格式。控制應用于圖像的壓縮程度的功能使您能夠控制圖像品質和文件大小。
PNG
可移植網絡圖形 (PNG) 格式是作為受專利保護的 GIF 文件格式的開放源替代格式而開發的。PNG 最多支持 64 位顏色深度,允許使用最多 1600 萬種顏色。由于 PNG 是一種比較新的格式,因此一些舊版本瀏覽器不支持 PNG 文件。與 JPG 不同, PNG 使用無損壓縮,這意味著保存圖像時不會丟失圖像數據。PNG 文件還支持 Alpha 透明度,允許使用最多 256 級透明度。
?
五、參考鏈接
1、http://hi.baidu.com/voidwizard/blog/item/0d8f23c295c79b5eb219a8da.html
2、[轉載]Flash火焰效果講解-BitmapData應用
地址:http://www.klstudio.com/post/194.html
3、BitmapData的整理http://uh.9ria.com/space-29516-do-blog-id-6898.html