2010年4月2日 星期五

BitmapData與ByteArray的操作


在Flash內,我們如果需要對外部載入圖檔,或是stage上的Sprite
做一些點陣圖形的操作(變形旋轉或其他)
要將處理過後的點陣資料,做頁面上顯示或是另做檔案儲存
在這過程中,都是在於DisplayObject,BitmapData與ByteArray這三者的轉換處理
以下是常用處理範例
BitmapData操作
1.如何取得DisplayObject的bitmapData


var bitmapData:BitmapData=new BitmapData(w,h);
bitmapData.draw(DisplayObject) 

2.如何取得外部圖檔或swf的bitmapData
(也就是將外部檔案寫到bitmapData內)
1.利用Loader載入外部檔案


var loader:Loade=new Loader()
loader.contentLoaderInfo.addEventListener(Event.COMPLETE, onLoadComplete);
loader.load('xxx.jpg');

2.載入完成後,將載入資料寫到bitmapData內


var bitmapData:BitmapData=new BitmapData(w,h);
bitmapData.draw(loader)


3.如何將bitmapData變成一個DisplayObject


var bitmapData:BitmapData=new BitmapData(w,h);
var bitmap:Bitmap=new Bitmap(bitmapData);
DisplayObjectContainer.addChild(bitmap); 

4.如何將bitmapData變成byteArray
如果要將圖檔以資料方式傳到Server上,要轉成byteArray形式才能上傳


var byteArray:ByteArray=JPEGEncoder.ecncode(bitmapdata)


ByteArray操作
1.如何將byteArray變成一個實體檔案


var targetFile:File =File.createTempFile();
var stream:FileStream = new FileStream();
stream.open(targetFile, FileMode.WRITE)
stream.writeBytes(byteArray, 0, 0);
stream.close(); 

2.如何將byteArray變成bitmapData


var bitmapData:BitmapData=new BitmapData(w,h);
bitmapData.setPixels(new Rectangle(),byteArray);

6 則留言:

匿名 提到...

這一行有錯
var bitmapData:BitmapData=new BitmapData();
1136: 引數個數錯誤。需要 2 個。

ozzysun 提到...

產生bitmapdata物件當然依定要傳入w ,h設定,只是在blog內寫的sample code只是用來表達概念,所以會有簡化的狀況,謝謝看的這麼仔細

匿名 提到...

我想請問一下
如果我用addchild去增加bitmap
想要去做修改~但卻只能修該最後一個addchild進來的bitmap
我該朝哪個方向去思考呢?

ozzysun 提到...

每一個bitmapData被包裝在一個DisplayObject內,
再把這被包裝好的DisplapObject
add到你真正要加入的Container內,就可以像一般物件那樣去操作了,如果你還想很清楚紀錄哪一個是哪一個..那就在產生DisplayObject時同時紀錄到Array內,就可以隨時找到你要的物件

匿名 提到...

我想請問一下
var byteArray:ByteArray=JPEGEncoder.ecncode(bitmapdata)
這一行會處存在哪裡呢?
我還是不太懂><

ozzysun 提到...

這是把bitmap資料經過JPEG編碼後,轉變成byteArray,既然已經得到byteArray後面就好處理了,譬如說你用POST方式把這資料傳給Server端的PHP,接收到這些資料就可以產生實體圖片檔案,又或者你開發的是AIR專案,就可以利用File在Client端產生實體檔案