Flex 畫面快照截圖及顯示實現代碼

在軟件開發過程中經常會有對畫面進行快照截圖的需求,例如把畫面當前顯示的狀態捕捉下來保存成圖片。接下來討論如何在flex中對畫面進行截圖,畫面截圖完成後怎樣再顯示到畫面上。 一、對指定畫面進行快照、截圖。
在Flex SDK中flash.display包下面有兩個類Bitmap和BitmapData。在flex中可以通過兩個類對圖片進行操作。BitmapData類中有一個draw方法這個方法的第一個參數是進行畫面截圖的源對象,這個對象必須實現IBitmapDrawable接口。而DisplayObject類實現了這個接口,DisplayObject是所有可見控件的先祖類,也就意味着所有在flex可以看到的畫面、控件都可以用draw方法來進行快照截圖。
具體的代碼如下:


private var bmpImage:Bitmap = null;
private function onClick():void
{
//創建一個大小和截圖對象一致的圖片
var bmpData:BitmapData = new BitmapData(source.width,source.height);
//進行快照截圖,其中第二個參數Matrix是對圖片進行變換用的,例如旋轉縮放等。
//如果圖片不需要變換可以用new Matrix()或者null都可以。
bmpData.draw(source,new Matrix());
//創建Bitmap對象
bmpImage = new Bitmap(bmpData);
}

BitmapData對象不能直接顯示到畫面上,所以需要把BitmapData對象封裝到Bitmap中,按下截圖按鈕後,Panel的快照就生成了,保存到了Bitmap對象中。
效果圖片:
效果圖A
二、將捕獲到的截屏圖片顯示到畫面上。
接下來就是把Bitmap對象顯示到畫面上,這裏需要藉助UIComponent類。由於直接把Bitmap對象加到Canvas等容器中,運行時會出錯,因爲容器中添加的子對象必須是UIComponent的子類,而Bitmap不是,所以需要UIComponent類來封裝一層。然後把UIComponent對象加入到Canvas容器中,這樣圖片就顯示出來了。
代碼如下所示:

private function onShow():void
{
//創建一個UIComponent對象
var uic:UIComponent = new UIComponent();
//將Bitmap對象加入到UIComponent對象中
uic.addChild(bmpImage);
//將UIComponent對象加入Canvas中
showImage.addChild(uic);
}

先按下截圖按鈕進行截圖操作,然後按下顯示按鈕把截圖顯示到Canvas中。效果如圖所示。
效果圖B
三、以下是這個程序的完整代碼:

<?xml version="1.0" encoding="utf-8"?>
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" layout="absolute"
fontFamily="宋體" fontSize="12" width="831" height="448">
<mx:Panel id="source" x="26" y="77" width="320" height="263" layout="absolute">
<mx:TextInput x="91" y="51"/>
<mx:TextInput x="91" y="106"/>
<mx:Button x="73.5" y="158" label="取 消"/>
<mx:Button x="172.5" y="158" label="確 定"/>
<mx:Label x="32" y="53" text="用戶名:"/>
<mx:Label x="32" y="108" text="密 碼:"/>
<mx:Label x="109" y="10" text="用戶登錄" fontWeight="bold"/>
</mx:Panel>
<mx:Canvas id="showImage" x="427" y="58" width="347" height="292">
</mx:Canvas>
<mx:Label x="124" y="32" text="截圖區域"/>
<mx:Label x="562" y="32" text="截圖顯示區域"/>
<mx:Button x="147" y="394" label="截圖" click="onClick()"/>
<mx:Button x="548" y="394" label="顯示" click="onShow()"/>
<mx:Script>
<!--[CDATA[
import mx.core.UIComponent;
private var bmpImage:Bitmap = null;
private function onClick():void
{
//創建一個大小和截圖對象一致的圖片
var bmpData:BitmapData = new BitmapData(source.width,source.height);
//進行快照截圖,其中第二個參數Matrix是對圖片進行變換用的,例如旋轉縮放等。
//如果圖片不需要變換可以用new Matrix()或者null都可以。
bmpData.draw(source,new Matrix());
//創建Bitmap對象
bmpImage = new Bitmap(bmpData);
}
private function onShow():void
{
//創建一個UIComponent對象
var uic:UIComponent = new UIComponent();
//將Bitmap對象加入到UIComponent對象中
uic.addChild(bmpImage);
//將UIComponent對象加入Canvas中
showImage.addChild(uic);
}
]]-->
</mx:Script>
</mx:Application>

四、總結。
雖然可以用Bitmap和BitmapData類進行截圖和現實,但是flex不能直接讀寫文件。圖片的保存還需要後臺程序的配合來完成。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章