2010/10/04

指定サイズ未満で最大の画質のJPEG画像を生成

Imageオブジェクトには、画像をファイルに保存するsave()の他にも、画像ファイルデータをメモリ上に出力し、そのバッファを指すポインタオブジェクトを返すtoBytes()メソッドも用意されています。

この機能を利用すれば、ファイルに保存することなく圧縮後のファイルサイズを知ることが出来ます。
下記のスクリプトは、圧縮後のサイズが上限値以下になる最大の画質でJPEG画像を保存するという応用例です。
var file=cwd().file('capture.jpeg');
sleep(2000);
try{
    var img=require('Window').Window.active.capture();
    for(var q=100;q>0;q--){
        try{
            var buf=img.toBytes('.jpeg',{quality:q});
            if((buf.size<100000)||(q==10)){
                file.update(buf);
                println(q);
                break;
            }
        }finally{
            free(buf);
        }
    }
}finally{
    free(img);
}
最初に、img変数にアクティブウィンドウのスクリーンショット画像のImageオブジェクトを代入してます。
次に、forループで最大画質の100から1ずつ減らしながら圧縮を試行しています。
toBytes()では、第1引数で拡張子やMIMEタイプで形式を指定します。第2引数の保存オプションで、q変数に格納されている画質を指定しています。
toBytes()が返すPointerオブジェクトでは、sizeプロパティでバイト数が取得できるので、その値が最大値以下ならばファイルへの保存を実行します。
Fileオブジェクトのupdate()メソッドはファイルを上書き保存するメソッドです。引数には多くの場合文字列を指定しますが、Pointerオブジェクトを指定すればバイト列を保存できます。
toBytes()が返したPointerオブジェクトは、不要になったらfree()関数で解放処理を行う必要があります。
最後に、Imageオブジェクトも解放します。

Webサイトにアップロードする画像を生成するときなどは、この例を応用して最適な画質のJPEG画像を生成させてみるといいでしょう。

0 件のコメント:

コメントを投稿