PNG画像処理の概要。

しらぎくモバイルシステムに搭載されている画像変換機能でのPNG画像の生成機能について解説します。

尚、PNG画像の詳細については、参考資料をご覧下さい。

「readGPNG.pl」- PNG画像の読込スクリプト。

通常モバイルサイトではiモード対応とするためGIF画像を用意し、ソフトバンクなどGIF画像に対応しない端末にはPNG画像などに変換する事で対応しますが、逆にiモード非対応サイトをiモードなどに公開するためにPNG画像をGIF画像に変換する機能があります。

「readPNG.pl」はPNG画像を他の形式に変換するために用いられるもので、PNG画像を読込んでパレット列とピクセル列などの情報を与えます。

具体的な処理の流れは以下のようになります。

  1. 指定された画像ファイルを開いてバイナリデータを読込む。
  2. バイナリデータがPNG画像である事を確認する。
  3. IHDRチャンクから必要な情報を取得する。
  4. PLTEチャンク及びtRNSチャンクからパレット情報・透過情報を取得する(インデックスドカラーの場合)。
  5. IDATチャンクを展開する。
  6. グレイスケールについては、対応するパレットを作成する(つまり、インデックスドカラー扱い)。
  7. 画像データを返す。

尚、現在のところ、インタレースPNG画像はサポートしておりません。

展開にはZlib.pmの利用を推奨しておりますが、実装されていない環境のために簡単なインフレート展開ルーティンもご用意しております。

展開時には勿論逆フィルタ処理が施されます。

「putPNG.pl」- PNG画像の書出スクリプト。

「putPNG.pl」はGIF画像などからPNG画像に変換する際に用いられ、パレット列やピクセル列などをもとにPNG画像を書出します。

これまでの純粋PerlでのPNG画像生成ルーティンはどれも無圧縮でしたが、無圧縮だと携帯端末の容量制限を満たせないので、何とか圧縮するようにしました。

圧縮には基本的にCompress::Zlibを利用する事を推奨しておりますが、Compress::Zlibを実装していないサーヴァもあるので、その様な環境のために簡単なデフレート圧縮ルーティンも開発しております。

この他、処理が複雑になり過ぎるとサーヴァの負担が過大なものになるので、あらゆる面で問題が起こり難くなるように工夫しました。

インデックスカラー限定としました。

フルカラーはGIFからの変換ではあり得ません。

グレイスケールもインデックスカラーにすれば済むだけの話しです。

1ビット型と 8ビット型の二つに限定しました。

2ビット型や 4ビット型も便利なのですが、圧縮前にピクセルデータをパッキングしなければならず、その手間が意外に掛かるため、これらは単純にストリング操作で対応できる 8ビット型として扱うものとしました。

パレットの最適化は行いません。

PNGではパレットデータについて、実際に利用している範囲だけを書き出せば良い事になっております。

しかしながら、実際に利用している範囲を決めるには、全てのピクセルを調べなければならず、これは意外に重荷になってしまうものです。

この為、パレットデータの利用状況を調べずに、パレットデータの最大数を出力するようにしております。

インタレースは使いません。
インタレースを用いると、画像データの並べ替えが生じ、これがかなりの負荷になります。
透過情報は、単一パレットコードにのみ指定します。

GIFの透過に対応する機能だけあれば良いので、この様な制限を設けました。

フィルタは用いません。
フィルタはフルカラーでの圧縮効率の向上を狙って導入されたものだそうで、インデックスカラーでは逆効果になる場合が多いようです。
その他、アルファチャネルやガンマ指定などは一切やりません。
どちらも携帯電話では対応していません。

制約事項。

余り大きな画像データを処理させると、サーヴァに過剰な負荷を与える恐れがあるため、携帯電話で利用され得る大きさを超えていると思われる大きさのデータは門前払いにしております


ページ外へのご案内。