flex中針對Image、Bitmap、BitmapData相互轉化
flex中針對Image、Bitmap、BitmapData的操作支援非常靈活,簡單整理下:
1、 設定Image元件的source(指定圖片路徑)屬性引入圖片,當圖片載入完成後,Image.content即為Bitmap物件例項
2、 使用資源類的方式[Embed(source=”sample.png”)]private var myImage:Class的方式引入圖片資源。這時 new myImage()獲得的即為BitmapAsset型別。
BitmapAsset繼承自Bitmap型別,支援其主要的功能方法,可以將該元素賦值給Image.source屬性以獲得顯示
3、 Bitmap.bitmapData屬性即儲存點陣圖資訊的BitmapData物件,BitmapData物件是flex中點陣圖操作的關鍵,其支援的與二進位制資料的轉換、畫素點操作都為flex的展示提供了強大技術支援。
BitmapData提供一下主要功能:
1、 複製獲取整個影象,部分影象
使用draw()方法。
注:源顯示物件不對此呼叫使用其任何已應用的轉換。它會被視為存在於庫或檔案中,沒有矩陣轉換、沒有顏色轉換,也沒有混合模式。要使用物件自己的 transform 屬性來繪製顯示物件(如影片剪輯),可以將其 transform 屬性物件複製到使用 BitmapData 物件的 Bitmap 物件的transform 屬性。
2、 獲取或者改變畫素,或者畫素組的顏色
使用setPixel(),setPixel32(),getPixel(),getPixel32(),
針對單個畫素位進行操作,給一段比較有趣的程式碼,分解顏色值
var bmd:BitmapData = new BitmapData(80, 40, true, 0xFF44AACC);var pixelValue:uint = bmd.getPixel32(1, 1);
var alphaValue:uint = pixelValue >> 24 & 0xFF;
var red:uint = pixelValue >> 16 & 0xFF;
var green:uint = pixelValue >> 8 & 0xFF;
var blue:uint = pixelValue & 0xFF;trace(alphaValue.toString(16));
// ff
trace(red.toString(16));
// 44
trace(green.toString(16));
// aa
trace(blue.toString(16)); //
3、濾鏡使用applyFilter(),在使用該方法之前可以通過generateFilterRect()判斷濾鏡的應用範圍。
4、 建立隨機的畫素(noise或perlin noise)
5、 可以把點陣圖轉換成byteArray或者Base64存入資料庫,並可以轉換回來
使用PNGEncoder,JPGEncoder等,或者直接使用getPixels(),setPixels()方法
關於Encoder使用方法一般如下:
/png/jpg類似
var encoder:\\PNGEncoder = new \\PNGEccoder;
var bytes:ByteArray = encoder.encode(bitmapData);
獲得的bytes如果想再次轉換為bitmapData則需要使用loader類來完成解析。從檔案或者資料庫讀取的圖片檔案也可以使用下面的方式進行轉換
程式碼如下:
var loader:\\Loader = new \\Loader;
loader.contentLoaderInfo.addEventListener(Event.Complete, loadCompleterHandler);
loader.loadBytes(bytes)
private function loadCompleterHandler(event:Event):void
{
var bitdata:BitmapData;
var loaderInfo:\\LoaderInfo = event.target;
if(loaderInfo.content is Bitmap)
{
bitdata = (loaderInfo.content as Bitmap).bitmapData;
}
else
{
bitdata = new BitmapData(this.tileSize, this.tileSize);
bitdata.draw(loaderInfo.content);
}
}
getPixels(),setPixels()方法使用,這兩個方法獲取指定區域的圖片點陣圖資訊,可以直接完成從byteArray到bitmapData的轉換,但是資料層次沒有壓縮輔助以ByteArray本身的compress()和uncompress()方法可以在儲存時節省一定的記憶體開銷
使用getPixels()獲取的byteArray資訊也可以使用loader.loadBytes()的方法來解析成BitmapData,但是在知道寬高的情況下其實可以直接使用setPixels()直接寫入bitmapData中
Code如下:
var bitmapdatanew:BitmapData = new BitmapData(300,225);
var byteArray:ByteArray = bitmapdata.getPixels( bitmapdata.rect );
byteArray.position = 0
bitmapdatanew.setPixels(new Rectangle(0,0,width,height),byteArray);
var bitmap:Bitmap = new Bitmap(bitmapdatanew);
_img.source = bitmap;
注意:bytearray如果在操作過程中進行過讀取和寫入操作,會影響其posiition屬性,該屬性會影響後面的讀寫操作,因此需要多多注意
壓縮和解壓縮的程式碼很簡單。直接在獲取的ByteArray上呼叫對應方法即可更改自身。Flash預設支援zlib壓縮演算法