メモ

覚書です

OptiPNG-0.6.1(libpng-1.2.32)をコンパイルしてみた

2008-10-19 20:43:18 | MinGW
OptiPNG-0.6.1(libpng-1.2.32)をコンパイルしてみた

少し前の話になりますが、libpngが更新されて1.2.32になってました。
そこで手元でコンパイルしていたのです。
(zlibの1.2.3とlibpngの1.2.32のソースをそれぞれダウンロードして、MinGWでコンパイルしました。)

今回はOptiPNG-0.6.1のlibpngは1.2.29で更新されてなかったので、1.2.32のソースを使って手元の環境でコンパイルしてみることにしました。
その時の覚書です。

まずoptipngのソースのsrc/scripts/gcc.mak.inのファイルの微調整です。
libpng.aを作成する箇所のコメントアウトされてる"#./configure"の行を削除します。

$(PNGDIR)/$(PNGLIB): $(ZDIR)/$(ZLIB)
cd $(PNGDIR);
$(MAKE) -f $(PNGMAK) $(PNGLIB);
cd $(BACKDIR)

上みたいな感じです。

次に./configureです。
それからlibpngの*.[ch]ファイルをlib/libpngフォルダへコピーしました。
(一応同じバージョンのlibpngとのdiffをとって、問題ないと判断はしました。)
zlibは1.2.3を使っているみたいなので、そのまま利用しました。
(試しにzlibのソースもコピーしてみましたが、問題ないみたい。バイナリは若干太りましたが。)

そしてmake。
srcフォルダ下にoptipng.exeが生成されます。
バイナリは配布されているものより(倍以上)太ってますが、これで一応安心?

※ソース入手先
OptiPNG Home Page
libpng.org: top level
zlib Home Site

※その他PNG関係
PNG-Tech: Technical Issues regarding the PNG File Format
A guide to PNG optimization

※AdvanceCOMP(再圧縮。7zipのDeflateを使うことで圧縮率を高めている)
Advance Projects - News

※pngrewrite(パレット整理)
pngrewrite

なおOptiPNGだけでなく、AdvanceCOMPもpngrewriteもMinGWを使ってコンパイルできます。

(16bppや24bppのファイルも含めて)PNGの色数が256以下の場合、pngrewriteでパレットの整理をしてから、 AdvanceCOMPで再圧縮するといい結果がでやすいみたい。それ以外もたいていはOptiPNGよりもAdvanceCOMPのほうがいい結果がでるようだ。(AdvanceCOMPで再圧縮してからOptiPNG を使用してみると既に最適化されているというメッセージで終わることが多い)

追記:
画像によるのだろうけど、試行錯誤したところ、良い結果がでやすい順番。
pngrewrite->OptiPNG->AdvanceCOMP->pngout
pngrewrite->pngout->OptiPNG->AdvanceCOMP
のどちらかかなぁ。

#追記
OptiPNGの0.6,0.6.1はBMPの読み込みで配列オーバーフロー攻撃の脆弱性があるそうです。
optipng-0.6.2によって修正されています。またlibpngは1.2.33になっているようです。

#追記
OptiPNG-0.6.2のconfigureオプションに
-with-system-zlib Use the system-supplied zlib
-with-system-libpng Use the system-supplied libpng
が加わっていました。

OptiPNG-0.6.2の修正パッチ(optipng-0.6.2.1.diff)がでているようです。

pngrewriteは1.3.0が2008年12月7日に出ています。
libpngは1.2.35が2009年2月19日に出ています。