2012年4月28日

ImageMagickによる画像加工 2

前回の「ImageMagickによる画像加工 1」からのつづき。
今回は、ImageMagickのコマンドラインを利用したバッチ処理のサンプルのご紹介。

入力フォルダ内にある、縦長、横長が混在する元画像から、正方形にクロップ(トリミング)する処理を作りました。
「画像左上(0,0)の位置から縦・横の短い辺にあわせて、正方形に切り抜く」という仕様。
左:使用前、右:使用後です。


WSH初体験ですので、ネットで下調べ。「@IT - チェック式 WSH入門」がわかりやすかったので、記事内「第10回 WScriptオブジェクトを利用する(1)」を参考に、VBScriptで記述しています。

1.thumb.vbs
Set objFSO = WScript.CreateObject("Scripting.FileSystemObject")
Set objFolder = objFSO.GetFolder(WScript.Arguments(0))
Set objShell = WScript.CreateObject("WScript.Shell")

loc = "C:\Program Files\ImageMagick-6.7.6-Q16\"

For Each objFile In objFolder.Files
  Set objExec = objShell.Exec(loc & "identify -format ""%w:%h"" " & objFile.path)
  strLine = objExec.StdOut.ReadLine
  iColon = Instr(strLine, ":")
  strWidth = Mid(strLine, 1, iColon-1)
  strHeight = Mid(strLine, iColon+1, Len(strLine))

  If CInt(strWidth) > CInt(strHeight) Then
    ex = loc & "convert -crop " & strHeight & "x" & strHeight & "+0+0 " & _
          objFile.path & " " & WScript.Arguments(1) & "\" & objFile.name
  Else
    ex = loc & "convert -crop " & strWidth & "x" & strWidth & "+0+0 " & _
          objFile.path & " " & WScript.Arguments(1) & "\" & objFile.name
  End If

  Set objExec = objShell.Exec(ex)
  Do While objExec.Status = 0
    WScript.Sleep 100
  Loop

Next

2.実行はコマンドプロンプトから
cscript c:\thumb.vbs c:\in c:\out
橙色部分はImageMagickのインストール先ですので、環境によって異なります。
緑色部分の行末「_」は、長い行を複数行に分割表記するためのもの(VBをやったことがあるひとにはおなじみ)。ブログの横幅の関係で二行に分けていますが、実際には一行で書けば不要です。
青色部分はフルパスで指定すればOK。

For文でフォルダ内のファイルがなくなるまで繰り返します。
WScript.Arguments(0)、WScript.Arguments(1)は、thumb.vbsを実行時につける引数。この例の場合は、c:¥in、c:¥outになります。
CIntは文字型から数値型への変換。これがないとバグります。

ImageMagickのコマンドライン機能を使い、
・「identyfy -format」で、画像の縦・横サイズを取得。
・「convert -crop」で画像切抜き。「+0+0」はクロップする始点(画像左上)。計算すれば、画像中心を基準に切り抜くことも可能ですよね。

このサンプルでは、出力先ディレクトリはあらかじめ用意しておく必要があります。
@IT - チェック式 WSH入門」には、ディレクトリがない場合に作成するスクリプト記述例が載っていますが、このサンプルではそこまではしません。
入力と出力のフォルダを同じにすれば、上書きします。

カラーミーショップで利用するなら、商品画像は100KB(一番安いライトプランの場合)以下でないとアップロードできませんので、適宜、「convert -resize -quality」でリサイズ、圧縮する必要があります。
convertのオプションについては「(HobNote)ImageMagick opiton」に、みやすく纏めてありました。