Flex:Airで画面のスクリーンショットを取得

画面のスクリーンショットをとるAirツールがいっぱいありますが、
あれどうやってるだろう?って思ったら結構簡単だったので。

ソースはこんなかんじ。


private function saveScreenshot(myHtml:HTML):void {
    var myScreenshotData:BitmapData;
    myScreenshotData = new BitmapData(myHtml.htmlLoader.contentWidth,myHtml.htmlLoader.contentHeight);
    myScreenshotData.draw(myHtml); //引数のオブジェクトのスクリーンショットを作成

    var pngEnc:PNGEncoder = new PNGEncoder();
    var pngBta:ByteArray = pngEnc.encode(myScreenshotData); //取得したスクリーンショットをPNGに
    var saveFile:File = myUploadDir.resolvePath(String("test.png"));
    var fs:FileStream = new FileStream();
    fs.open(saveFile,FileMode.WRITE);
    fs.writeBytes(pngBta,0,pngBta.length); //PNGファイルを書き込む
    fs.close();

}

ためしに mx:HTML でやってみました。
mx:HTML にhtmlを読み込んで、それをBitmapData.draw() で変換し、
あとはそれをpngにエンコードして保存するだけ。

実際は mx:HTML をリサイズできるようにして、
それに合わせて取得できるようにすれば、あの枠だけ表示させて
それをドラッグして大きさを決めてスクリーンショット
ってやつができるはずです。

ちなみにサイズを指定が

    myScreenshotData = new BitmapData(myHtml.htmlLoader.contentWidth,myHtml.htmlLoader.contentHeight);

となっていますが、これはスクロールして一番最後までいったとこまで取得するために、こうしてます。
htmlLoader.contentWidth と htmlLoader.contentHeight はHTMLの高さです。
これを普通に myHtml.width myHtml.height にすれば今表示されてる部分だけになります。
ちなみに contentHeight は2880 なので、それ以上の横幅、高さをもつHTMLの場合は
切れてしまいます。

Flexリファレンス:HTMLLoader