Qiita Teams that are logged in
You are not logged in to any team

Log in to Qiita Team
Community
OrganizationEventAdvent CalendarQiitadon (β)
Service
Qiita JobsQiita ZineQiita Blog
39
Help us understand the problem. What is going on with this article?

More than 5 years have passed since last update.

@zayarwinttun

ShellScript + ImageMagick 写真処理を効率化!

ShellScriptとImageMagickコマンドラインを使って写真処理をやってみました。

写真処理って普段photoshopかgimpのようなguiソフトを使うでしょう。しかし、時間によって画像を処理するとか、たくさんの写真に同じ処理をするとか、ウェブアプリから写真を処理するとか、するときは、そのようなソフトなら難しいでしょう。

ImageMagickは写真のリサイズ・回転から複数の写真を合成や効果かけるまで全てをコマンドラインで実現することができます。

この記事では、
1. ImageMagickのインストール
2. ImageMagickのコマンドテスト
3. Bashと合わせて使ってみる
4. よく使うコマンドの紹介
という形で進みます。

ImageMagickのインストール

  • http://www.imagemagick.org/script/binary-releases.php から使用環境に合わせてパッケージをダウンロードします。
  • 私の場合、Mac OS X BinaryをMacPortsでインストールします。Homebreawや直接ダウンロードの方法もありますが、MacPorts使ったら他の依存ファイルも自動的にインストールされるそうです。
    ※ MacPortsがない方は、先にMacPortsをインストールします。
  • ターミナルから sudo port install ImageMagick でインストールが始まります。パスワードが聞かれましたらrootアクセスのパスワードを入力します。このインストールはちょっと時間かかりますので完了するまでお待ちください。

ImageMagickのコマンドテスト

ターミナルから、

$ convert image.jpg -implode 1 image-imploded.jpg

を実行したら、image.jpgが処理されてimage-imploded.jpgとして保存します。
result-01.jpg

※ convertコマンド見つからないエラーが出る場合、ターミナルを1回閉じて再開しますとできると思います。

Bashと合わせて使ってみる

カメラで撮った写真のサイズが大きくてリサイズしたい時、1枚だったらguiソフトでやりますが、何百枚の写真をリサイズするなら大変でしょう。

resizejpg.sh
#!/bin/bash

for file in *.jpg; do
    filename=( `echo $file | tr -s '.' ' '` )
    convert $file -resize '300>' ${filename[0]}-tmp.${filename[1]}
    size=`identify -ping -format "%[fx:w]x%[fx:h]" ${filename[0]}-tmp.${filename[1]}`
    mv ${filename[0]}-tmp.${filename[1]} ${filename[0]}-${size}.${filename[1]}
done

解析:
- #!/bin/bash:これからbashシェルが始まるとシステムに通知。
- for file in *.jpg; do:現在のディレクトリ中のjpgファイル全部を呼び、変数fileとしてループで使う。
- filename=( `echo $file | tr -s '.' ' '` ):ファイルの名前と拡張を分けて配列としてfilenameに保存。
- convert $file -resize '300>' ${filename[0]}-tmp.${filename[1]}:もし写真の幅が300より大きい場合300にリサイズし、*-tmp.jpgの新しいファイル名で保存。
- size=`identify -ping -format "%[fx:w]x%[fx:h]" ${filename[0]}-tmp.${filename[1]}`:新しく保存した写真のサイズを変数sizeに保存。
- mv ${filename[0]}-tmp.${filename[1]} ${filename[0]}-${size}.${filename[1]}:ファイル名を写真サイズをつける(*幅x高.jpg)。
- done:現在のループ完了。

スクリプトを実行すると写真全部は幅300pxにリサイズして新しいサイズをファイル名の後ろに書いて保存します。

よく使うコマンドの紹介

resize

先ほどの例で使ったコマンドです。写真サイズを調整します。

convert 入力写真.jpg -resize '幅x高(Geometry)' 出力写真.jpg

幅x高だけではなく以下形でも使えます。
Geometryと言いますが、resizeだけではなく、scale border crop extent thumbnail ... などにも同様です。

サイズ 説明
scale% 50% 幅高両方を半分にする
scale-x%*x*scale-y% 30x50% 幅30%高50%にする
width 300 幅を300pxにする。高は自動的に調整
x*heihgt* x300 高を300pxにする。幅は自動的に調整
width*x*height 500x300 幅と高の最大値。比率を保つ。
width*x*height^ 500x300^ 幅と高の最小値。比率を保つ。
width*x*height! 500x300! 幅500px高300pxにきっぱりと調整。比率を無視。
width*x*height> 500x300> 幅500px高300pxより大きい場合だけ調整。
width*x*height< 500x300< 幅500px高300pxより小さい場合だけ調整。
@area @10000 写真の面積。だいたい幅115px高86px(9890px)に調整。

scale

写真サイズを調整します。

convert 入力写真.jpg -scale '幅x高' 出力写真.jpg

resizeと同じになりますがより処理スピードが速いそうです。

rotate

写真を回転します。

convert 入力写真.jpg -rotate '度' 出力写真.jpg

convert image.jpg -rotate '-90' image-rotate-90.jpg
result-scale-01.jpg

crop

写真をトリム。

convert 入力写真.jpg -crop 'Geometry{offset}' 出力写真.jpg

convert image.jpg -crop 400x400+170+50 image-crop.jpg
result-crop-01.jpg
猫ちゃんの写真の元サイズは667x1000で、offset170x50 からの400x400はちょうどう頭のところになります。

border

写真ボーダーを作る。

convert 入力写真.jpg -bordercolor '(#haxcolor|色)' -border 'Geometry' 出力写真.jpg

convert image.jpg -bordercolor SkyBlue -border 50x50 image-border.jpg
result-border-01-crop.jpg

flip

写真を上下反転。

convert 入力写真.jpg -flip 出力写真.jpg

convert image.jpg -flip image-flip.jpg
result-flip-01-crop.jpg

flop

写真を左右反転。

convert 入力写真.jpg -flop 出力写真.jpg

convert image.jpg -flop image-flop.jpg
result-flop-01-crop.jpg

draw

写真上ものを描きます。なんでも描けるますが、円と長方形描いみましょう。

convert image.jpg -fill white -draw 'circle 200,100 120,40' \
-fill blue -draw 'fill-opacity 0.8 rectangle 150,60 250,80' \
image-draw.jpg

result-draw-01-crop.jpg
写真元サイズ:400x400

append

複数の写真を繋ぐ。この記事で使ってる効果前、効果後の写真は以下のようなコマンドで作りました。

convert \( image-before.jpg -resize 400 \) \
\( arrow.png -resize '100' -gravity Center -extent x200 \) \
\( image-after.jpg -resize 400 \) \
+append image-result.jpg

基本のコマンドしか紹介してなかったですが、他の素晴らしい効果のコマンドや使い方をこちらからご参考できます。

convert image.jpg -charcoal 2 image-charcoal.jpg

result-charcoal-01-crop.jpg

猫写真:PAKUTASO

39
Help us understand the problem. What is going on with this article?
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
39
Help us understand the problem. What is going on with this article?