convertでjpegファイルをresizeするときの小技

convertコマンドの形式は基本的に
convert <入力ファイル> [変換処理オプション] <出力ファイル>

となっています。ImageMagickのサイトのconvertの例
convert JPEG -resize SIZE OUTPUT
となっていますが、実はこの単純な例であれば
convert -size SIZE JPEG OUTPUT
とも書けます。違いといえば、前者は convert コマンドが能動的にサイズ変換(とその後のファイル形式の変換)をするのに対し、後者はconvertコマンドが利用しているJPEGライブラリ(libjpeg.so.X)が指定したサイズで最初から(圧縮された情報を)指定した画像サイズでイメージ展開してしまうということです。すなわち後者ではconvertはファイル形式の変換しかしません。

で、この何がTipsかというと、実はJpegのような自然画の圧縮は、元の画像サイズによらないような内部形式になっているので、元のサイズでイメージ展開しようと違うサイズでイメージ展開しようと内部処理はあまり変わらないのです。なのでサイズ変換はJPEG形式のままでしておいた方が素早く処理できるんです。

一方の前者の方式では、既に展開されてしまったイメージに対して、convert コマンドが自力でリサイズ処理をしなくれはなりません。これでは元がJPEGであったというメリットがまったく活かせないのです。

うまく説明できてない気がしますが、感覚的には、後者は圧縮されたままサイズ変換ができるのに対して、前者は一回展開して、それからサイズ変換をしなければならないというところでしょうか。

とりあえず、手元の1.8MのJPEG画像を 1/4 サイズにするのに、後者の方が10倍以上速いです。さらに原理的にも、後者の方がきれいな画像が得られると思います。
コメントを投稿

このブログの人気の投稿

シェル操作課題への回答

連想配列 - Bash Advent Calendar - Day 5

今、永福町のピザ戦争が熱い!