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 とでは受け渡し出来ない点です。 |