WSHでImageMagick、Tomblooに位置情報付加
ImageMagickはCOMからも使えるんですね。
Install the ImageMagickObject COM+ Component @ ImageMagick
たとえば、identify -verbose rose.jpgをWSHで実行したいときはこうやります。
var ImageMagick = WSH.CreateObject("ImageMagickObject.MagickImage.1"); ImageMagick.Identify("-verbose", "rose.jpg");
別にWshShellでいいじゃん、という気も。注意しないといけないのは、上のコードでは、ダダーッと情報が表示されるけれど、-formatのときなどはIdentifyが値を返すようになるところ。
var info = ImageMagick.Identify("-format", "%[fx:w/72] by %[fx:h/72] inches", "document.png"); WSH.Echo(info);
何だか使いづらい。
Tomblooで使うサンプル
executeWSHでImageMagickからExifを読み取って、逆ジオコーディングします。
使った → http://refits.cgk.affrc.go.jp/tsrv/jp/rgeocode.html
addAround(Tombloo.Service, 'post', function(proceed, args){ var ps = args[0]; if(ps.type !== "photo") return proceed(args); return succeed() .addCallback(function(){ return ps.itemUrl; }) // get coordinates by exif .addCallback(function(url){ var exif = eval(executeWSH(function(){ var ImageMagick = WSH.CreateObject("ImageMagickObject.MagickImage.1"); return ImageMagick.Identify("-format", "[[%[EXIF:GPSLatitude]],[%[EXIF:GPSLongitude]]]", ARG_0); }, [url])); if(!exif[0].length) return null; return { lat: exif[0][0] + exif[0][1] / 60 + exif[0][1] / 3600, lon: exif[1][0] + exif[1][1] / 60 + exif[1][1] / 3600 }; }) // get address .addCallback(function(coordinates){ if(!coordinates) return proceed(args); var url = "http://refits.cgk.affrc.go.jp/tsrv/jp/rgeocode.php?" + queryString(coordinates) + "&jsonp"; return loadJSONDoc(url).addCallback(function(res){ if(!res.status) return proceed(args); var address = [ res.prefecture.pname, res.municipality.mname, res.local.section ].join(""); ps.description = ps.description || ""; ps.description += " (" + address + ")"; return proceed(args); }) }) });
動作例
http://arikui.tumblr.com/post/87195335/exif
executeWSHは引数の扱いがちょっと分かりづらい気もする。WshArgumentsで扱えた方が分かりやすいかなあ。あと、名前付き引数とかも(あまり使わないけど)。