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 入力ファイル名 -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が同じになることを確認しています.
例:
スクリーンショットをTeX用EPSへ
convert 入力ファイル名 eps2:出力ファイル名
http://windom.phys.hirosaki-u.ac.jp/fswiki/wiki.cgi?page=%B2%E8%C1%FC%A5%D5%A5%A1%A5%A4%A5%EB%A4%F2eps%A4%CB%CA%D1%B4%B9%A4%B7%A4%C6LaTeX%A4%C7%BB%C8%A4%A6より.びっくりするほどファイルサイズが小さくなります.
例:
- convert input.png eps2:output.eps
付録1: 切り出し領域を求める方法
IrfanViewを使っています*2.ダウンロードは「IrfanView」のページは移転いたしましたからのほうがいいでしょう.
画像を開いて,画像内をマウスでドラッグすると,切り出し可能な領域を表す箱が描かれます.またタイトルバーには,領域サイズやアスペクト比*3が出ます.
ドラッグ後も,箱の上下左右をドラッグして微調整できます.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