4.Cywinによる小ワザ (1)サムネール画像の作成



Windowsのエクスプローラから辿れるところにある画像をイッキにサムネールを作成するスクリプトを作る。
具体的には、
画像置き場が sambaで見えている、
My DocumentsあたりでHTMLを作っていて、あとでftpあたりのツールで鯖に送ろうとしている
等の状況を想定している。これらのフォルダにある多数の画像を、下表のような名前付けの対応にしたがってサムネール化する。画像系のHTMLページに便利 か も。
このような処理を行うときには、シェルスクリプトでバッチ処理をすると便利である。ディレクトリ名の取得はfindで、ファイル名前の書き 換えはawk、画像の書き換えにはconvertを使う。
元画像名前
サムネール
a0001.jpg
a0001_.jpg
a0002.jpg
a0002_.jpg
a0003.jpg
a0003_.jpg
:

xyz01.jpg
xyz01_jpg
yyy.jpg
yyy_.jpg
zzz.jpg
zzz_jp

サムネールを作るには、ImageMagickの/bin/convert を使う。
convert -thumbnail 縦x横 元画像名  変換後画像名
と指定してやる。
ファイルネームの加工はfindとawkとgrepでやってみる。あるフォルダにある、ファイルネームの拡張子を除いた部分を抽出するには
% find `pwd` | awk -F / '{print $NF ;}'|awk -F . '{print $1 ;}'
この1行コマンドの意味であるが、たとえばあるディレクトリでfindすると、
/cygdrive/j/public_html/computer/cygwin/setup8.jpg
と出力される。この出力結果を加工する。フォルダの階層は"/"で区切られ、拡張子との区切りは"."で区切られているので、
/で区切られた最後(awkの$ NF)の部分 の"うんたら.jpg"がファイル名 →  awk -F / '{print $NF ;}'
ファイル名の.の前 (awkの$1)がファイル名本体、その後ろ(awkの$2、jpgの部分)が拡張子 → awk -F . '{print $1 ;}'
と区分けする。これをパイプ"|"で繋いで、順次実行するようにする。

それから、findの結果を再帰的にconvertに渡すには
#!/bin/sh
for i in `find うんたら`;do
convert こうたら
done
exit 0

とfor〜doneループの入れ子にして実行すれば良い。

結論。作ったスクリプト。
FOLDERNAMEのところに目標のフォルダを指定する。コマンドラインの引数のARGVとして渡せばもっとスマートか?でも、タイプミスするのが怖い ので、変数と して渡すことにした。
#!/bin/sh
FOLDERNAME='/cygdrive/j/public_html/computer/cygwin/'
for i in `find ${FOLDERNAME} |grep -i jpg` ;do
/bin/convert -thumbnail 200x400 $i `echo $i | awk -F / '{print $(NF) ;}'|awk -F . '{print $1 ;}'`_.jpg
done
てな感じでスクリプト完成!とする。適当な名前、makethumbnail.sh とかテキトーな名前を付けて保存する。実行属性を付けて実行可能としておく。
# chmod +x makethumbnail.sh
実行は
# ./makethumbnail.sh
とすればOK。
なお、応用として、一気にjpegをgifに変換するというワザにも使える。具体的にはdoneの前の.jpgを.gifと書き換えるだけ。


続きの、5. Cywinによる小ワザ(perl編)に続く
cygwinの入り口に 戻る。
 もしくはHOMEに戻る。