最初に結論
ImageMagickに入ってる convert
コマンドを使ふ。
以下のコマンドを実行すると、PNGから可能な限り劣化を最小限に変換できる。 Windows可
convert hogehoge.png -quality 100 hogehoge.jpg
画像形式について
画像形式にはJPEGやPNG、GIF、それとWindows bitmap(BMP)なんかがありますね。いや、ほかにもたくさんたくさんあるんですけど、Webで汎用的かつ一般に流通してるのは99.9%これですね。
最近のアプリケーションはたいてい賢いので、これらの形式ならどれでも大差なく扱ってくれるのですが、それでもどれか一つの形式に統一しなければいけない、あるいはしておきたい場面はあるものです。
ちょっと考へてみたところでは、同人ゲーム制作なんかではありがちかもしれないですね。僕はやったことないですけど。
んで、上に挙げた形式の中でJPEGだけは lossy (データを間引くことでサイズを縮める、つまりファイルが劣化する。非可逆)なファイル形式です。JPEGに変換するだけで、確実にデータが損失します。ところが どうしてもJPEGにしたい といふことはあります。 僕にはあるんです
そんなときには妥協して、PNGなどからJPEGの圧縮率100に変換することにします。圧縮率100とは、JPEGの最も高画質な状態です(が、通常はそれでも僅かに劣化することに注意する必要があります)。
で、圧縮率100のJPEGに変換してやるにはGIMPなどを使ってもできるんですが、起動がめんどくさいのと、マウス操作必須なのでいろいろだるいです(数年前はこれでやってました…)。そこで、コマンドラインから ImageMagick を使ひませう。
ちなみにGIF形式は仕様上256色までしか扱ふことができないので、単純なアイコンなどには向きますが、写真や鮮やかな色彩のイラストなどでは減色の必要があり、やはり画質の劣化、データの損失が発生します。
ImageMagickの導入
Windowsのひとは ImageMagick: Install from Binary Distribution から "Win32 dynamic at 16 bits-per-pixel" ってやつを選んでインストール。 (なんでこんなに差分があるのよ、って理由はリンク先に英語で書いてあるんですが、精度の問題です。ふつうはこのバージョン以外を選ぶ理由はない)
DebianとかUbuntuを使ってたら sudo apt-get install imagemagick
とかやったら入る気がします。Mac OS XならHomeBrewでもMacPortsでも入るんじゃないですかね。入ったはずです。タブンネ。
画像形式を変換する
やり方は冒頭に書いた通り なのですが、これでは説明不足なので補足します。ImageMagickはとっても賢い子なので、拡張子から空気を読んで、よしなにファイル形式を選んでくれます。
-quality 100
と指定する必要があるのは(ここまで紹介してきた形式では)JPEGだけです。つまり、GIFからPNGに変換するには次のやうにすれば良いです。
convert hogehoge.gif hogehoge.png
あと、 -quality 100
の指定なしにJPEGに変換しようとすると、ファイルサイズは縮みますが
PNGからJPEGに決め打ちで変換したい
僕の使ってる用途(CDのアルバムアートを合法的に蒐集して音楽ライブラリに取り込む)だと、PNGで存在する画像をJPEGにしたい! って感じなので、わざわざこんなコマンドを打ち込むのはめんどくさいですね。
ってわけで、バッチファイルにします。ファイル名は p2j.bat
といふ名前にして、 Path
の通ったフォルダに保存します。よくわかんないならメモ帳か何かでデスクトップに保存してから、マウスで C:\Windows
とかに抛り込むと良いんじゃないですかね。きっと。
REM p2j: PNG-to-JPEG convert
REM usage:
REM p2j hogehoge
REM hogehoge.png -> hogehoge.jpg
convert "%~pn1.png" -quality 100 "%~pn1.jpg"
変換したい対象の画像ファイルが folder.png
で、これをJPEGに変換したいとします。そのファイルのあるフォルダをエクスプローラで開いて、アドレスバーに p2j folder
と打ち込みます。すると、 folder.jpg
ができあがります。
えっ、そんなのめんどくさい? 覚えられない? うるせえ。 [png jpeg 右クリック 変換] とかで検索して出てきたツールでも入れてりゃ良いんじゃないんですか? クォリティも使ひ方も安全性も面倒見切れませんよ><
ちなみにちなみに
-compress LossLess
を指定してやればロスレス形式のJPEGに変換できる… のですが、これは互換性の問題で非推奨です(Windows7では表示できましたが、どのJPEGライブラリでもデコードできるとは限りません)。
僕は「一枚単位で画像変換するくらゐでけちけちする必要ないよね!」といふ 富豪的プログラミングな発想 で Q16 を勧めるのですが、大量の画像を捌くから高速な方が良い! なんて場合は Q8 版を使って全然大丈夫なはずです。それから、ImageMagick高速化まとめ #ImageMagick #Linux - Qiitaによれば、自前でビルドできるなら --disable-openmp
オプションを付けてやると良いみたいですね。僕は知りません。
あと、ImageMagickには mogrify
といふコマンドがあって、これを使っても似たやうなことができ、なほかつ一括処理に向いてゐます。が、こちらを使ふと基本的にファイルは上書きしてしまふことになるので、僕は使ひません。PNGからJPEGへの変換は必ずlossyなので、元のファイルは残しておきたいからです。
参考文献
……あんまり読んでないです><