しらぎくモバイルシステムに搭載されている画像変換機能でのPNG画像の生成機能について解説します。
尚、PNG画像の詳細については、参考資料をご覧下さい。
通常モバイルサイトではiモード対応とするためGIF画像を用意し、ソフトバンクなどGIF画像に対応しない端末にはPNG画像などに変換する事で対応しますが、逆にiモード非対応サイトをiモードなどに公開するためにPNG画像をGIF画像に変換する機能があります。
「readPNG.pl」はPNG画像を他の形式に変換するために用いられるもので、PNG画像を読込んでパレット列とピクセル列などの情報を与えます。
具体的な処理の流れは以下のようになります。
尚、現在のところ、インタレースPNG画像はサポートしておりません。
展開にはZlib.pmの利用を推奨しておりますが、実装されていない環境のために簡単なインフレート展開ルーティンもご用意しております。
展開時には勿論逆フィルタ処理が施されます。
「putPNG.pl」はGIF画像などからPNG画像に変換する際に用いられ、パレット列やピクセル列などをもとにPNG画像を書出します。
これまでの純粋PerlでのPNG画像生成ルーティンはどれも無圧縮でしたが、無圧縮だと携帯端末の容量制限を満たせないので、何とか圧縮するようにしました。
圧縮には基本的にCompress::Zlibを利用する事を推奨しておりますが、Compress::Zlibを実装していないサーヴァもあるので、その様な環境のために簡単なデフレート圧縮ルーティンも開発しております。
この他、処理が複雑になり過ぎるとサーヴァの負担が過大なものになるので、あらゆる面で問題が起こり難くなるように工夫しました。
フルカラーはGIFからの変換ではあり得ません。
グレイスケールもインデックスカラーにすれば済むだけの話しです。
2ビット型や 4ビット型も便利なのですが、圧縮前にピクセルデータをパッキングしなければならず、その手間が意外に掛かるため、これらは単純にストリング操作で対応できる 8ビット型として扱うものとしました。
PNGではパレットデータについて、実際に利用している範囲だけを書き出せば良い事になっております。
しかしながら、実際に利用している範囲を決めるには、全てのピクセルを調べなければならず、これは意外に重荷になってしまうものです。
この為、パレットデータの利用状況を調べずに、パレットデータの最大数を出力するようにしております。
GIFの透過に対応する機能だけあれば良いので、この様な制限を設けました。
余り大きな画像データを処理させると、サーヴァに過剰な負荷を与える恐れがあるため、携帯電話で利用され得る大きさを超えていると思われる大きさのデータは門前払いにしております。