2019年9月17日火曜日

png や jpeg を epsにする話(2019)

このエントリーをブックマークに追加 このエントリーを含むはてなブックマーク
『jpeg 画像なら gm convert で eps2 にして、 png 画像なら convert で eps3 にするとよい。』という話になりました。どっちかにまとまらなかった…

ピクセル画像ファイル(jpeg や png) を eps ファイルにしたとき、ファイルサイズが大きくなってしまいます。どうすればいいでしょう? という件、一昔前なら『 sam2p で変換しとこう』ということにしていたのですが、Ubuntu 18.04 LTS を導入したところ、正式に sam2p が無くなっていました。そりゃあなあ…… debian package にすら既にないし、そもそも上流公式ページすら無くなってるしなあ(ソースはあるっぽい)

というわけで sam2p 無き令和の時代にあって、改めてepsファイルにどう変換するか問題を扱っていくわけですが、とりあえず下記のように testpng.png という画像を1枚用意し、そこからjpeg画像への変換、ならびに imagemagick, graphicsmagick による eps 変換を行いました。(Ubuntu 18.04LTSで導入したものを使いました。バージョン表記略)
 
得られた結果はご覧の通り。  
なんの指定もせずに変換したepsファイル、つまり Postscript Level 1 にしたものは、ファイルサイズが肥大することが分かります。 また、imagemagick では設定によっては変換することが出来ません。 PS Level2 と Level3 だけを取り出して表にします。


jpg(im) jpg(gm) png(im) png(gm)
jpg/png 45039 39572
eps2 48968 48945 49651 49642
eps3 49424 61298 37030 45145

jpeg画像を最も小さく変換するのは graphicsmagick の Postscript Level 2 指定を行った変換 ( gm convert picture.jpg eps2:picture.eps ) となりました。
一方、png画像を最も小さく変換するのは imagemagick の Postscript Level 3 指定を行った変換 ( convert figure.png eps3:figure.eps ) となりました。
いったい何故このような差になったのか……

imagemagick の結果だけを比較してみます。  
jpeg の変換は eps3 より eps2 のほうがファイルサイズが小さく、逆に png の変換は eps2 より eps3 のほうが小さいことが分かります。png の eps3 への変換が、元の png 画像よりも小さくなっているのは、元の png 画像が低い圧縮度合いであったためと思われます。(元画像は gnuplot の term pngcairo で作成したものです。)

これに対し、graphicsmagick の結果だけを比較してみます。  
graphicsmagick が生成する PS Level 3 eps は、データストリームがASCII文字になっています。その影響を大きく受けるのは jpeg をPS Level 3 eps に変換するときのようで、imagemagick の場合以上に、PS Level 2 eps よりもファイルサイズが大きくなります。
また、graphicsmagick で png を変換すると、 imagemagick で変換したものより若干ファイルサイズが大きくなります。PS Level 3 eps が 元の png 画像のファイルサイズより大きいことから、imagemagick と違い、改めて圧縮するようなことはしていないようです。(そういえばgmのほうが処理が早かったような。)

表を眺めてみると、graphicsmagick で jpeg を eps3 に変換するのが最もファイルサイズが膨らむようなので、それだけは避ける。 gmなのかimなのか分からないなら「とりあえずeps3にすることだけ考える」でいいのかも知れません。つまり、

convert pixelpicture.jpg eps3:pixelpicture.eps

これだけ覚えておけ、でもいいのか……? PS Level 3 をうまく処理出来ないみたいな話が出てきたら諦めてeps2にしましょう。

誰かやってください:
・jpegファイルからpngファイルを作った場合、同じような結果になるのか?
・png や jpeg のファイル圧縮度合いはどれくらい影響するのか?