デジカメで撮った写真をブログなどにアップロードする場合に、高解像度がゆえにファイルサイズが無駄にデカくて、アップロードに時間がかかってしまったり、あるいはアップロード可能なファイルサイズの上限に達してしまって、写真のアップロードができなかったりすることがある。ちなみに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をダブルクリックする労力よりも、はるかに実装の労力が上まりそう。目的が達成されるのでこれでよしとしておく。