Main

August 25, 2006

Image Quantization in ActionScript3

del.icio.us/keitap見てる人はお気づきかもしれないけど最近個人的に色ブームだったりする。中でもアツイのは減色。この32bitフルカラーでブロードバンドなご時世に何を減色だ、と思う方も多いとは思うが、まあ、要らない余分な情報を捨てるってのは画像処理する上で割りと便利だと思うので、多分使い道はある。と思う。ちょっとだけ。

そんなわけで、AS3の勉強も兼ねて、ImageMagickで実装されているoctree [Wikipedia] [Octree Color Quantization]を用いた減色アルゴリズムをAS3に移植してみた。でも、元のコードはImageMagickではなく、Adam Doppelt氏がJavaで実装したコードを参考にした。

http://blog.keitap.com/misc/as3/quantize-0.1.tar.gz

QuantizeTest.asが動作確認用のコードになる。QuantizeTest.swfで実際の実行結果を確認できる。左から順に、元画像、128色、64色、32色、16色、8色。
fdbで実行させると処理時間のtrace文が出てくる。残念な事に処理速度は速くなくて手元の環境(Pen4 2.8GHz)では以下の感じ。

[trace] 128 374 milliseconds
[trace] 64 371 milliseconds
[trace] 32 297 milliseconds
[trace] 16 283 milliseconds
[trace] 8 227 milliseconds
色数、処理時間の順。200x200の画像を8色にするのに200ミリ秒ってのはちょっといただけない。ただ今のところ、Javaのコードを単にAS3に書き直しただけなので処理速度を改善出来そうな箇所はいくつかあると思う。他にもAPI的にコレで良いのかって疑問もあるけど取り合えず公開してみる。

因みに今回、Flex SDK(mxmlcとfdb)だけで実装したんだけど、この程度のライブラリ書くぐらいならFlex Builderいらねえなと思った。fdbでコマンドラインデバッグするのは泣けてくるけど。

ところで、AS3ってインナークラスつくれないのにずっこけた。これは不便きわまりない。