AS3:画像処理&保存に JPEGEncoder
PHP で画像処理するフローは結構あったりしますが、この場合にGDライブラリを使うか、ImageMagick を使うかという2択があります。後者は高機能ではあるもののインストールされているサーバーが少なく実質は GD の1択となります。しかし GD だけでは画像の拡大縮小や形式変換、合成程度しかできないから、回転反転何やかんやと他のことをしようと思えば PEAR とかで探してみる、なんつーことをやったりします。
画像処理系ライブラリはサーバーに負荷をかけるものも多く、処理数が多ければサーバーの処理力が必要になります。数をさばくWebサーバーに必要以上に演算力を持たせるのはもったいないから、別に演算力のあるサーバーを用意したりもしますが、サーバーを分けるともちろん管理も煩雑になって、管理できる人間を選びはじめるというマイナスもあったり。
そこで、最近顕著に画像処理系として優秀な FLASH です。ちょっと言語として普通はもっていなきゃいけない仕様がようやっと実装された感はあるわけですが、VM みたいなものを動かせるだけのバイナリを持てない「プレイヤー」だという前提からすればようやったってところでしょうか、冗長ですかそうですか、つまりクライアント上の FlashPlayer に演算を渡し処理結果を JpegEncoder でくるんで PHP に返してもらえればサーバーの画像処理演算力は不要ですというわけです。
リソース分散、知の集合にともなう力の集合、ともすれば責任の集合、あまつさえ希薄化、うそですそんなたいしたものではないはずですが、がしかし、PHP から FLASH の画像処理系や関連資産が使えることのメリットは大きく、さらに処理をする場所を選ばない(わざわざ高いサーバー借りなくてもマイPCで回せるし、うまくやれば他人のPCがやってくれる)という点でも魅力的です。
実装についてはこのあたりのサイトが参考になります。
Flashから画像ファイルを保存する - ficc.jp
As3 画像変換ライブラリ、JPGEncoder , PNGEncoder - blog.hi-farm.net
Flash 上で Bitmap を JPEG 画像に変換 - trick7.com
一つだけ。FLASH上で画像を縮小しても GD のようになめらかにならなかったので以下作ってみました。画像データを渡して一定高のサムネイル画像データを得ます。縮小の際にシャープさ(なめらかさ)を設定でき、出力をJpegEncoderに投げれます。
//GDっぽい画像縮小
function get_naildata( src_data:BitmapData, nail_height=96 ){
var blur_range = 2/3;//1でGDっぽい縮小、1より小さいとよりシャープ、0でFLASHの縮小
var src = new Bitmap( src_data, "never", true);
var sw = src_data.width
var sh = src_data.height
var sf = src.filters;
var nh = nail_height //サムネイル高
var nw = Math.round(sw*nh/sh); //サムネイル幅
var m = new Matrix();
m.scale( nw/sw, nh/sh );
//縮小時のジャギを見越したブラー
sf.push( new BlurFilter( (sw*blur_range/nw)-1, (sh*blur_range/nh)-1, BitmapFilterQuality.HIGH) );
src.filters = sf
var temp_data = new BitmapData( sw, sh );
temp_data.draw(src);
//src_data.dispose();
var nail_data = new BitmapData(nw,nh);
var temp = new Bitmap( temp_data, "never", true);
nail_data.draw(temp, m, null, null, null, true );
temp_data.dispose();
return(nail_data);
}