デジカメで撮った写真をブログなどにアップロードする場合に、高解像度がゆえにファイルサイズが無駄にデカくて、アップロードに時間がかかってしまったり、あるいはアップロード可能なファイルサイズの上限に達してしまって、写真のアップロードができなかったりすることがある。ちなみにWordPressの3.1系では、ファイルサイズの上限が2MBとかなり小さめ。
妻も同じくWordPressを使っており、写真がメインのブログなので、写真の解像度を落とすためだけにわざわざ画像編集ソフトを立ち上げるのは面倒だし、一枚一枚の写真をGUI操作でサイズ変更するのも苦痛だ。そこで、ディレクトリ内の写真を一括して特定のサイズに縮小するようなスクリプトを書いた。当初はまだ妻がWindowsを使っていたのでVBScriptで実装。identify、convertコマンドが使えるように、あらかじめImageMagickをインストールしておく。
Option Explicit Dim shell, dir, file, dimensions, size, width, height, maxsize, geometry size = 1280 Set shell = CreateObject("WScript.Shell") Set dir = shell.Exec("cmd /C dir /B /L *.jpg") Do While Not dir.StdOut.AtEndOfStream file = dir.StdOut.ReadLine Set dimensions = shell.Exec("cmd /C identify -format %G " & file) geometry = Split(dimensions.StdOut.ReadLine, "x") width = CInt(geometry(0)) height = CInt(geometry(1)) If width > height Then maxsize = width geometry = size & " " Else maxsize = height geometry = "x" & size & " " End If If maxsize > size Then shell.Exec("cmd /C convert " & file & " -resize " & geometry & file) End If Loop
VBScriptなんて使ったことないもんだから、これだけのコード書くのにえらい苦労したのを覚えている。VBScriptわかりにくいな。
identifyコマンドで各JPGファイルのディメンジョンを取得して、希望のサイズ(size変数の値:1280px)よりも大きい場合にだけ、convertコマンドで縮小するというもの。
マイピクチャ配下にBlogPhotoというディレクトリを作って、その中に上記スクリプトをShrinkPhoto.vbsとして保存。ブログにアップロードしたい写真は、このBlogPhotoディレクトリにコピーして、ShrinkPhoto.vbsをダブルクリックすればOKという流れ。
identifyやconvertが実行される度に、いちいちコマンドプロンプトがポンポン出てくるのが非常に煩わしいが、とりあえず目的は達成されるのでよしとしてた。何気に自分もfacebookに写真をアップするのに重宝してたし。
そして、妻がWindowsからMacに乗り換えることになったので、今度はbashで同じ処理を再実装。ImageMagickのインストールはportコマンド一発で済むので、Windowsよりはるかにラク。
$ sudo port install ImageMagick
ShrinkPhotoのコードはこんな感じ。
#!/bin/bash
SIZE=1280
cd `dirname $0`
for f in `ls | grep -i '\.jpg'`; do
dimensions=`identify -format %G $f`
width=`echo $dimensions | awk -Fx '{print $1}'`
height=`echo $dimensions | awk -Fx '{print $2}'`
if [ $width -gt $height ]; then
maxsize=$width
geometry="$SIZE"
else
maxsize=$height
geometry="x$SIZE"
fi
if [ $maxsize -gt $SIZE ]; then
convert $f -resize $geometry $f
fi
done
同じように~/Pictures/BlogPhotoディレクトリを作ってShrinkPhotoを実行権限付きで保存。希望の縮小サイズはSIZE変数で調整する。
FinderからShrinkPhotoを起動すると、ホームディレクトリ($HOME)がカレントディレクトリ($PWD)になるようなので、4行目のcdがないとうまく動かない。
inotifyを使えばディレクトリにファイルをコピーした時点で、自動的に検出&縮小なんてこともできるんだろうけど(inotifyってLinuxしかないっけ?)、ShrinkPhotoをダブルクリックする労力よりも、はるかに実装の労力が上まりそう。目的が達成されるのでこれでよしとしておく。