1月 022012
 

ディレクトリ内の写真を一括縮小する | Inhale n’ Exhaleデジカメで撮った写真をブログなどにアップロードする場合に、高解像度がゆえにファイルサイズが無駄にデカくて、アップロードに時間がかかってしまったり、あるいはアップロード可能なファイルサイズの上限に達してしまって、写真のアップロードができなかったりすることがある。ちなみにWordPressの3.1系では、ファイルサイズの上限が2MBとかなり小さめ。


妻も同じくWordPressを使っており、写真がメインのブログなので、写真の解像度を落とすためだけにわざわざ画像編集ソフトを立ち上げるのは面倒だし、一枚一枚の写真をGUI操作でサイズ変更するのも苦痛だ。そこで、ディレクトリ内の写真を一括して特定のサイズに縮小するようなスクリプトを書いた。当初はまだ妻がWindowsを使っていたのでVBScriptで実装。identifyconvertコマンドが使えるように、あらかじめ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という流れ。
identifyconvertが実行される度に、いちいちコマンドプロンプトがポンポン出てくるのが非常に煩わしいが、とりあえず目的は達成されるのでよしとしてた。何気に自分も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をダブルクリックする労力よりも、はるかに実装の労力が上まりそう。目的が達成されるのでこれでよしとしておく。

 返信する

以下のHTML タグと属性が利用できます: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>

(required)

(required)

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください