PNG イメージの取り扱い
最終更新日:2000/02/20
 GIF に代わる画像フォーマットとして、PNG の普及が期待されます。
GIF は、LZW の特許問題で、もはや、自由につかえるものでは
無くなってしまいました。
また、GIF は、フルカラーが扱えない、といった問題もあります。
JPEG は、高い圧縮率が得られますが、反面、伸長した時に、元の画像と全く
同じ品質が得られる訳ではありません。(非可逆圧縮)
PNG は、何度、圧縮、伸長を繰り返しても劣化しない「可逆圧縮」です。
PNG と JPEG は使用する目的によって、使い分けられるものでしょう。

PNG の問題点。
PNG の圧縮には、これもオープンソースですが、GZIP 等で使われる、
zlib ライブラリが使われます。
圧縮効率は、LZW を使うより、良いのですが、LZW に比べると、
かなり複雑なようです。
圧縮部分を(実用的な速度で動くように)自前で作成するのは、
かなり困難でしょう。
また、圧縮率が良い分、圧縮には GIF より多少時間がかかるようです。
伸長(表示)処理には、時間はかかりません。

何よりも、ブラウザ側の対応が遅かったのが問題だと思います。
私の、古いマシンでは、IE3.02 を使っていますが、
サポートされていません。
IE4.0以上は、使いたくても、遅くて使い物になりません。

【 オープンソースを使う 】

  上記のように、PNG では、オープンソースを使うのが良いでしょう。
PNG は、圧縮には、zlib ライブラリ(別のオープンソース)を
使います。
従って、zlib ライブラリは別個に整備する必要があります。
手順は、PNG のアーカイブの中にも多少記載されています。
PNG のソースの入手は、以下のサイトで可能です。

Portable Network Graphics

【 BMP ファイルを PNG ファイルへ変換するプログラム 】

  どちらから作っても良いのですが、PNG はまだ一般的に入手可能な
画像が少ないので、先に、BMP からの変換プログラムを作る
事にしました。

bmp2png.c  ・・・メイン
dib2png.c  ・・・DIB から PNG ファイルへ書き出し

コンパイルは以下の通りです。

    >cl -c /Zp dib2png.c
    >cl  bmp2png.c dib2png.obj libpng.lib zlib.lib bmplib.lib

一応、パレットにも RLE にも対応していますので、
ほとんどの BMP ファイルは、適切な PNG フォーマットに変換可能な
はずです。PNG は、アルファチャネル(透明度)といった情報も持てますが、
BMP 自体に、情報が無いので、これらは、考慮していません。
PNG のほうが圧倒的に情報量の多い、フォーマットです。

【 PNG ファイルを BMP ファイルへ変換するプログラム 】

  次に、PNG ファイルから、BMP ファイルへの変換プログラムを
作成します。参考になるのが、付属する readpng.c です。
以下は、それを参考に、作成したものです。

png2bmp.c  ・・・メイン
png2dib.c  ・・・PNG ファイルを読み、DIB を作成

コンパイルは以下の通りです。

    >cl -c /Zp png2dib.c
    >cl  png2bmp.c png2dib.obj libpng.lib zlib.lib bmplib.lib

ソースを2つに分けているのは、ウインドウ・アプリケーションにも
使えるようにした為です。

ここでは、バックグランドカラー、ガンマ特性等を特に処理していません。
もし、これらが正確に必要なら、コードを追加して下さい。

【 DLL 化について 】

 スタティックライブラリでも、C言語で使う分には一向にかまいませんが、
VisualBasic で使おうとする場合、DLL 化する必要があります。
libpng 自体には、MS Windows 環境で、DLL 化するオプションは設けられて
いません。(ざっと見た限りでは)
この場合、若干サイズは損ですが、VB 用のラッパーを作成すれば良いでしょう。
なお、zlib は DLL 化出来ますので、PNG 自体はそれほど大きいものでは
ありません。

DLL 化で注意するのは、JPEG の際も同じでしたが、MS Windows 環境では、
「ファイル構造体のポインタ」が、DLL とでは受け渡し出来ない点です。

|HOME|戻る|