2006年11月16日
でっかいJPEGを扱う
Google Maps API をいじっていると楽しくてしょうがないので コレを貼り付けて遊んでみようかと思った。
しかし、3800x3800ピクセルぐらいのデッカイ画像なので読込展開にスゲー時間がかかる。1枚当たり1.7秒ぐらい。Google Maps API のタイル単位に PHP で処理しようとすると、タイル生成要求ごとに読込展開してしまう。初回アクセス時に25枚ぐらい読み込まなきゃならんので、25×1.7秒という長大な時間が掛かってしまってダメダメだ。
Java Servlet なら、JPEG展開済み画像オブジェクトを管理するクラスを作ってメモリに常駐させてどうにかするのだが、PHPだとそーゆーのって無理だよな。(ボクが知らないだけかもしれないが)
Perl だと mod_perl を使えばなんとかなるかもしれないが、ちょっとトリッキーな感じがする。そこまでするならJavaれよ、みたいな。
しかし、Javaるには、環境のセットアップとかがあって面倒なので、PHPでなんとかしたい。
JPEGの指定した一部分だけを読込展開できれば、高速化できるんじゃないかと思った。今までのプログラムは、全体を展開してから、その一部分だけを採用しており、要らない部分まで展開処理をしていて無駄である。
JPEGは8x8ピクセルのブロックごとに圧縮して格納されているので、要らない部分の展開をサボっても一部分だけ取り出せるはずだ。
そして、さんざん調べた結果見つけたのが jpegtran コマンドの -crop オプション。Loss less で部分取り出し!
で、使ってみたら 0.8秒ぐらいになった。2倍の高速化!
でも、それでも遅いよなぁ。
やはり、Javaとかでオブジェクトプーリングを実装しないと実用にならん。
つーか、タイル画像を全部プレ変換してディスクに置いとくのが一番速い。
このエントリーのトラックバックURL:
http://weblog.rukihena.com/mt/mt-tb.cgi/614