Hatena::ブログ(Diary)

わさっき RSSフィード

2011年01月11日

[] convertで画像変換

PowerPointや,アプリケーションスクリーンショットをとってから,日記に載せる際に,convertというコマンドを活用して,画像の変換や加工をしています.一律処理をする,GUIソフトウェアももちろんあるわけですが,コマンドとして実行することで,シェルのヒストリに残るというのは,大きなメリットです.

ヒストリを見直して,今後も使いそうになるコマンドの構文を取り出してみました.なお,使用したバージョンは「ImageMagick 6.4.0 01/19/10 Q16」で,Cygwinで動かしています.Linuxその他でも,大きな差はないと思います.

リファレンス

基本形

convert 入力ファイル名 変換指示 出力ファイル名

変換指示をせず,入出力のファイル名でサフィックス(いわゆる拡張子)を変えれば,画像フォーマットの変換ができます.

例:

  • convert input.png output.jpg

切り出し

convert 入力ファイル名 -crop 幅x高さ+左X座標+上Y座標 出力ファイル名

なお,左上からのときは「幅x高さ+0+0」とします.

例:

  • convert input.png -crop 518x175+0+0 output.jpg

幅・高さの変更

convert 入力ファイル名 -resize 幅 出力ファイル名

convert 入力ファイル名 -resize 拡大率% 出力ファイル名

convert 入力ファイル名 -resize '幅x高さ!' 出力ファイル名

「-resize 幅」としたとき,アスペクト比が合うように高さを決めてくれます.パーセント指定においては,もちろん100より小さくもできます.アスペクト比を無視して,強制的に「この幅・この高さ」にしたいときは,高さの後ろに「!」をつけます.ただしシェルが変に解釈することのないよう,エスケープが必要かもしれません.

例:

  • convert input.png -crop 600x260+187+332 -resize 400 output.jpg
  • convert input.png -resize 66% output.jpg
  • convert input.png -crop 600x260+187+332 -resize 400x173\! output.jpg

品質変更

convert 入力ファイル名 -quality 値 出力ファイル名

出力フォーマットがJPEGのときは,よく知られた品質のことで,1が最悪(ファイルサイズ最小),100が最良(ファイルサイズ最大)です.

PNGの圧縮率指定には一般に,0(無圧縮)から9(最高圧縮)までの1桁の数値が使われますが,convertの-quality指定では,十の位にこの値を書くことになります.一の位には,圧縮方法が指定できます.詳しくはhttp://www.imagemagick.org/script/command-line-options.php?ImageMagick=htts3c50nvbo7gl9983gnphll6#qualityから*1.手元では,-quality 100よりも-quality 99のほうが,ファイルサイズは小さく,-quality 100と-quality 90が同じになることを確認しています.

例:

  • convert input.png -resize 90 output.jpg
  • convert input.png -resize 92 output.png

スクリーンショットTeXEPS

convert 入力ファイル名 eps2:出力ファイル名

no titleより.びっくりするほどファイルサイズが小さくなります.

例:

  • convert input.png eps2:output.eps

付録1: 切り出し領域を求める方法

IrfanViewを使っています*2ダウンロード「IrfanView」のページは移転いたしましたからのほうがいいでしょう.

画像を開いて,画像内をマウスドラッグすると,切り出し可能な領域を表す箱が描かれます.またタイトルバーには,領域サイズやアスペクト比*3が出ます.

f:id:takehikom:20110111054447p:image

f:id:takehikom:20110111054448p:image

ドラッグ後も,箱の上下左右をドラッグして微調整できます.1枚だけ切り出すなど,convertが不要なら,Ctrl+Yで切り出せます.

付録2: -quality指定と,作られるPNGファイルのサイズ

とある画像(input.png)に対して,zshで一括変換をしてみました.

$ for i in {90..99}; convert input.png -quality $i output$i.png
$ wc -c output*
 152965 output90.png
 120807 output91.png
 119170 output92.png
 125083 output93.png
 120074 output94.png
 120727 output95.png
 120727 output96.png
 120727 output97.png
 120727 output98.png
 120727 output99.png
1241734 合計
$ md5sum output*
022816e2760d8ed3e1962a36c161a284 *output90.png
eecebf223b15ecb7aea8bd7492c642b0 *output91.png
f0e1a13ea5ce14d46b997308d72cac7e *output92.png
1040afd690cb62984c9eb3449e2e2290 *output93.png
fba46fe21138461ef33cbdc8c7ce6c28 *output94.png
31ea4954a39d73002a720d189136f773 *output95.png
31ea4954a39d73002a720d189136f773 *output96.png
31ea4954a39d73002a720d189136f773 *output97.png
31ea4954a39d73002a720d189136f773 *output98.png
31ea4954a39d73002a720d189136f773 *output99.png

この結果から,今回の画像と,convertコマンドのバージョンにおいては,「-quality 95」から「-quality 99」までが同じ意味になること,また「-quality 92」がファイルサイズ最小となることが分かります.なお,3桁にしても変化ありません.「-quality 82」は「-quality 92」よりも,出来上がるファイルのサイズが大きくなることも,確認しています.

付録3: スライドに角丸長方形を描く

余談で話すの各スライドに,青い囲みがありますが,あれもまた,convertコマンドで描かせたのでした*4.手順を書いておきます.

まずPowerPointで内容を作り込み,「名前を付けて保存」を選びます.ファイル名は何でもいいのですが,ファイルの種類については,「PNG ポータブル ネットワーク グラフィックス形式 (*.png)」にします.

それで保存のボタンを押すと,「プレゼンテーションのスライドをすべてエクスポートしますか? それとも、現在のスライドだけをエクスポートしますか?」という質問が出ます.ここで「すべてのスライド」を選ぶと,ディレクトリが作られ,「スライド1.PNG」から連番でファイルとして保存されます.

zshで,そのディレクトリに移動し,以下のようにしました.

$ for i in {1..8}; mv *$i* $i.png
$ for i in {1..8}; convert $i.png -geometry 320x240 -fill none -stroke blue -draw 'roundrectangle 0,0 319,239 8,8' -quality 90 $i.jpg

*1:その中にある"The quality setting has no effect on the appearance of PNG and MNG images, since the compression is always lossless."も大切ですね.

*2:かつては座標を知る目的で,GIMPを使っていました.

*3:幅を高さで割った値.1026x768と同じアスペクト比にしたければ,「1.333」です.

*4:美しさという点では,PowerPointのスライドマスタで描いたほうが良かったなとも思っています.

リンク元