JpgEncoderの非同期版やってみた。(前に)

LINEで送る
Pocket

えっと、実はすごい前に作っていたので今は誰か作っているのかもですが、
adobeのcorelibにある、JpgEncoderの非同期版を作ってみました。

http://www.hi-farm.net/labs/modJPGEncoder.as.zip

ライセンス的に大丈夫だという判断で公開ですが、まずそうでしたらすぐに取り下げますのですみませんが、ご連絡下さい。

使い方は、
1. corelibのJpgEncoder.asを解凍したファイルに差し替えて下さい。

コードではこんな風にして下さい(サンプル:画像保存のAIRアプリ)

<?xml version=”1.0″ encoding=”utf-8″?>
<mx:WindowedApplication xmlns:mx=”http://www.adobe.com/2006/mxml”; layout=”absolute” creationComplete=”initApp()”>
<mx:Script>
<![CDATA[

import com.adobe.images.JPGEncoder;
import flash.events.*;

private var jpg:JPGEncoder;
private function initApp():void
{
btn.addEventListener(MouseEvent.CLICK, clickHandler);
}

private function clickHandler(e:MouseEvent):void
{
//— 
jpg = new JPGEncoder(100);
//— 処理中のイベント
jpg.addEventListener(“progressing”, progressHandler);
//— 処理完了のイベント
jpg.addEventListener(“finished”, finishedHandler);

var bmpdata:BitmapData = new BitmapData(stage.stageWidth, stage.stageHeight, false);
bmpdata.draw(stage);
jpg.encodeAsync(bmpdata);
}

private function progressHandler(e:Event):void
{
var percent:String = new int((jpg.cur/jpg.maxCur)*100).toString() + “%”;
ti.text = percent;
}
private function finishedHandler(e:Event):void
{
ti.text = “convert finished.”;

//– 終了したら、ファイルに保存する。
var f:File = File.desktopDirectory.resolvePath(“out.jpg”);
var fs:FileStream = new FileStream();
fs.open(f, FileMode.WRITE);
fs.writeBytes( jpg.ba, 0, jpg.ba.length);
fs.close();
}

]]>
</mx:Script>
<mx:VBox>
<mx:TextInput id=”ti” width=”400″ text=”jpg export test” />
<mx:Button width=”300″ height=”40″ id=”btn” label=”generate desktop/out.jpg” />
</mx:VBox>
</mx:WindowedApplication>

内部的に行っていることは、bytearray形式でBitmapDataを作るときに、同期バージョンはforループでまわしてたのですが、timerでのまわし方に変えた、簡単に言えばそういう事です。

2008年6月1日04:14

As3 画像変換ライブラリ、JPGEncoder , PNGEncoder

LINEで送る
Pocket

ImageConverterという本当に簡単すぎる画像変換アプリをこないだ作ったのですが、画像変換には、
Corelibの、
JPGEncoderとPNGEncoderを利用しました。
GIFがないのはライセンス問題とかなのかな?

入手方法は、
http://code.google.com/p/as3corelib/
のページの『Featured Downloads』あたりからダウンロードして下さい。
ダウンロードしたファイルを解凍し、Flexから使えるようにします。

実際のファイルが、
[パス]/com/adobe/images/
以下にあるものとして話しを進めます。

これは、
bitmapDataのデータを変換します。
importしておきたいもの:
flash.display.BitmapData
flash.utils.ByteArray

使い方
JPGEncoder:

//ライブラリのインポート
import com.adobe.images.JPGEncoder;

private var jpgEncoder:JPGEncoder = new JPGEncoder();
private var byteArray:ByteArray = new ByteArray();

//100 , 100 は幅、高さです。
private var bitmapData:BitmapData = new BitmapData( 100, 100);

//bitmapDataに実際のデータを書き込みます。
bitmapData.draw(『何らかのデータ』);

//bitmapDataのデータをjpgに変換しbyteArrayに格納します。
byteArray = jpgEncoder.encode(bitmapData);

このbyteArrayを使ってURLStream , FileStreamでファイルを書き込むと、jpg画像が完成です。

JPGEncoderとの違いは、こちらはstaticなので、インスタンスを作成しません。
要するに、
JPGEncoder -> new JPGEncoder()とかしてから使う
PNGEncoder -> new とかなしでそのまま使う
ってことなんです。

一応サンプル。
PNGEncoder:

//ライブラリのインポート
import com.adobe.images.PNGEncoder;

private var byteArray:ByteArray = new ByteArray();

//100 , 100 は幅、高さです。
private var bitmapData:BitmapData = new BitmapData( 100, 100);

//bitmapDataに実際のデータを書き込みます。
bitmapData.draw(『何らかのデータ』);

//bitmapDataのデータをjpgに変換しbyteArrayに格納します。
byteArray = PNGEncoder.encode(bitmapData);

このbyteArrayを使ってURLStream , FileStreamでファイルを書き込むと、png画像が完成です。

ちなみに、実際のファイルはJPGEncoder.asとPNGEncoder.asにありますので、興味があれば一度見てみましょう。
僕にはまだまだ理解できませんが、ByteArrayを活用している風ですね。僕も理解して動画変換のライブラリとか作ってみたいです(あるいは作ってほしいです)。

2007年8月31日00:40