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