画像変換

Image_transform
http://pear.php.net/package/Image_Transform/download/0.9.0/
が更新されましたね。ってことで画像変換のお話。(Image_transformはまったく関係なし)

携帯向けサイトを作っていると、画像変換には画像容量の問題が付きまとってきます。
GDやImageMagickなど画像変換用ライブラリなどはありますが、容量指定ができない。困る。
仕方がないので、ImageMagickを利用して制限内に収まる画像容量で、もっともきれいな画像を作るものを作ることになるわけです。

で、最近気がついたんですが、ImageMagickって標準出力に変換後の画像を吐き出せるので、これをshell_executeでもらってきて、strlenしてサイズを求めて・・・・とやることに。

なんだかんだいって面度くさい。

ところで、カテゴリのMojaviの話が出てませんが、実は現在の案件は「Mojavi3を使え」という隠れた至上命題があるので、この変換エンジンをMojavi3で実装してしまいました。

簡単な構成(Defaultに加えた部分)は、

  • ImageConvertRequest
  • Default module IndexAction
  • Default module IndexSuccessView
  • Image.class.php

Mojaviに関わっているのは上の3つで最後はImageMagickのラッパー+容量最適化部分です。

「なんだよ、Mojavi関係ないじゃん」とか言われそうですが、待ってください。 肝はImageConvertRequest。こいつがいつものWebRequestとはまったく違った振る舞いをしてくれます。
/index.php/dir1/dir2/hoge.jpg/key/value/
というPATH_INFO形式のリクエストに対して、まず、/dir1/dir2/hoge.jpg までをimg_pathという名前でsetParameterします。次に、key/valueをWebRequest同様に処理してやるのです。

もし/key/valueがなかったらあたかも普通に画像を読んでいるように見えるわけです。たとえ/key/valueが設定されていても、最後に/alias/fuga.gifとかつけてやれば画像のよう。
携帯電話だと、機種によっては拡張子でファイル形式を判断していたりするので、この方法は役に立ちます。
ちなみに、いま/alias/fuga.gifとしてやりましたが、実はIndexActionがこいつを解釈して、拡張子gifを変換後のフォーマットに指定してやるようにしてあります。

最後にIndexSuccessViewはContent-Typeとかのheader吐いて、本体吐いて、そのあと余分なものが出力されないように念のためexitしてます。

ソースはたぶん公開しません。