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"の行を削除します。
上みたいな感じです。
次に./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日に出ています。
少し前の話になりますが、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"の行を削除します。
- cd $(PNGDIR);
- $(MAKE) -f $(PNGMAK) $(PNGLIB);
- cd $(BACKDIR)
- $(MAKE) -f $(PNGMAK) $(PNGLIB);
$(PNGDIR)/$(PNGLIB): $(ZDIR)/$(ZLIB)
上みたいな感じです。
次に./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を使ってコンパイルできます。
追記:
画像によるのだろうけど、試行錯誤したところ、良い結果がでやすい順番。
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日に出ています。