f8g

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で扱えた方が分かりやすいかなあ。あと、名前付き引数とかも(あまり使わないけど)。