1. 程式人生 > >flex中針對Image、Bitmap、BitmapData相互轉化

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壓縮演算法