y-matsui::weblog

電子楽器、音楽、コンピュータ、プログラミング、雑感。面倒くさいオヤジの独り言

サーバーサイドでイメージ加工”ImageMagick Windows版”

UnixLinux)で良くその名前を聞く”ImageMagick”のWindows版。
本家サイトのダウンロードURL
Windows版バイナリ-ダウンロードURL
対応フォーマットが約90種類と凄い
※PDFなんていう文書フォーマットからAVIやMPEGなんていう動画フォーマットまでフォローしてるのが珍しい。

■インストールやら使い方やらの情報
http://mechanics.civil.tohoku.ac.jp/soft/node43.html
http://www.ss.iij4u.or.jp/~somali/web/_imagemagick.html
http://vision.kuee.kyoto-u.ac.jp/~nob/doc/imagemagick/imagemagick.html
http://www.tryhp.net/homeserver16.htm

VB,WSHで動作させる”今回の使い方にぴったりな例”まで
http://tuka.s12.xrea.com/index.xcg?p=ImageMagick#p4
http://www.hawk.34sp.com/stdpls/dwsh/dwsh_imagick.html

■convertメソッドのオプション一覧

うーーん、こりゃ凄い。半日足らずで一気に出来ちゃった

データディレクトリの中の全ファイルを対象に、サブディレクトリを走査しつつ、変換元ファイルとサムネール画像の最終更新日時を比較しながら、横幅120pix固定のjpegファイルを次々に生成していくプログラム(VBS)が完成。
タスクスケジューラで1日1回(夜中)実行すれば良いでしょう。
※生成されるサムネールの名前が、オリジナルファイル名+".jpg"ってのも(Unixみたいで)渋い。→例:sample.gif.jpg(笑)
※全ファイルを一応走査するものの、毎回イメージ生成をするわけでないので、CPUの占有率は少ない(はず)
※あとはPDFその他のマニアックなフォーマットの試験ですな


Const DATA_DIR = "d:\Image"
Const SUB_DIR = "thumb"
CONST DB_TYPE =1 'SQLServer
Const SCALE = "120x" '幅を120で固定(高さは指定しない)
Dim objImg
Dim objFS, objFolder

Set objImg = CreateObject("ImageMagickObject.MagickImage.1")
Set objFS = CreateObject("Scripting.FileSystemObject")
Set objFolder = objFS.GetFolder(DATA_DIR)

Call MakeThumb (objFolder)

Set objImg = Nothing


'/////////////////////////// サムネールイメージ生成 //////////////////////////

Sub MakeThumb(objFolder)
Dim objFile,objFile2,objSubFolder
Dim ImgName
Dim cnt
cnt=0
On Error Resume Next
'ディレクトリ内の全てのファイル
For Each objFile In objFolder.Files
'サムネール用フォルダが無ければ作成
if objFS.FolderExists(objFolder& "\" & SUB_DIR)=FALSE Then
objFS.CreateFolder(objFolder& "\" & SUB_DIR)
End If

'サムネールがすでに存在するかどうかのチェック
ImgName=objFS.BuildPath(objFolder.Path & "\" & SUB_DIR & "\", objFile.Name & ".jpg")

if objFS.FileExists(ImgName) Then
Set objFile2=objFS.GetFile(ImgName)
'元データの最終更新日がサムネールイメージの最終更新日よりも新しい場合再生成
if objFile.DateLastModified > objFile2.DateLastModified then
objImg.Convert "-resize", SCALE, objFile.Path,_
objFS.BuildPath(objFolder.Path & "\" & SUB_DIR & "\", objFile.Name & ".jpg")
cnt=cnt+1
Set objFile2=Nothing
End If
Else 'サムネールイメージが存在しない場合は作成
objImg.Convert "-resize", SCALE, objFile.Path,_
objFS.BuildPath(objFolder.Path & "\" & SUB_DIR & "\", objFile.Name & ".jpg")
cnt=cnt+1
End If
Next

'ディレクトリ内のサブディレクト
For Each objSubFolder In objFolder.SubFolders
if right(objSubFolder.Name,len(SUB_DIR))<>SUB_DIR Then
MakeThumb objSubFolder
End If
Next

'ログの記述
If cnt>0 then
logmessage=cnt & "件のサムネールを作成しました"
End If
Call WriteLogDB(DB_TYPE,"ファイル",0,"サムネール作成数",1,"登録","MakeThumbnailImage.vbs",logmessage)

End Sub