Under the Bridge

a Picture of the Late Him

MT4.2:JPEGファイルのEXIF情報を取得するプラグイン(Ver0.6)

2009年5月12日 23:25 | Writer: yoshi | 記事本文 | コメント(0) | トラックバック(1)

MT4.x用のJPEGファイルのEXIF情報を取得するプラグインを発作的に書き換えた。

AssetExifプラグインに刺激を受けた部分も多々ある。

コード

package MT::Plugin::GetEXIF;
use strict;
use MT::Plugin;
use base qw(MT::Plugin);
our $VERSION = '0.6';
use Image::ExifTool;
use MT::Template::Context;
use lib $ENV{MT_HOME} ? "$ENV{MT_HOME}/plugins/GetEXIF/extlib" : '/plugins/GetEXIF/extlib';

my $plugin = new MT::Plugin::GetEXIF({
    id => 'GetEXIF',
    key => 'get_exif',
    name => '<MT_TRANS phrase="PluginName">',
    version => $VERSION,
    description => '<MT_TRANS phrase="Description">',
    author_name => '<MT_TRANS phrase="AuthorName">',
    author_link => 'http://www.mtde.info/',
    l10n_class => 'GetEXIF::L10N',
});
MT->add_plugin($plugin);

sub init_registry
{
    my $plugin = shift;
    $plugin->registry({
        tags => {
            function => {
                'GetEXIF' => \&_hdlr_getexif,
                'GetEXIFAsset' => \&_hdlr_getexif_asset,
                'GetEXIFGpsPosition' => \&_hdlr_gpsposition,
            },
        },
    });
}

# 画像の任意パスを指定して好きな情報を取得するツールモード
sub _hdlr_getexif {
   my ($ctx, $args) = @_;
   my $filepath = $args->{filepath};
   my $exiftag = $args->{exiftag};
   my $option = $args->{option};
   my $exif_tool = new Image::ExifTool;
   my $exif_info = $exif_tool->ImageInfo($filepath);
   my ($key,$out);

   #キー名を指定してひとつのデータを取得
   if ('' ne $exiftag){
      for $key (sort keys %$exif_info) {
        if ($key eq $exiftag) {
           if ('pair' eq $option){
              $out = $key.":".$$exif_info{$key};
           } elsif (('' eq $option) || ('value' eq $option)) {
              $out = $$exif_info{$key};
           } elsif ('key' eq $option) {
              $out = $key;
           }
           return $out;
        }
      }
   }else{
   #キー名を省略して全データを取得
      if ('pair' eq $option){
          foreach $key (sort keys %$exif_info) {$out = $out . $key.":".$$exif_info{$key}."<br />\n";}
      }elsif (('' eq $option) || ('value' eq $option)) {
          foreach $key (sort keys %$exif_info) {$out = join("<br />" ,values(%$exif_info));}
      }elsif ('key' eq $option) {
          foreach $key (sort keys %$exif_info) {$out =join( "<br />" , keys(%$exif_info));}
      }
      return $out;
   }
}

# Asset画像の情報を取得するモード
sub _hdlr_getexif_asset {
   my ($ctx, $args) = @_;
   my $asset = $ctx->stash('asset');
   my $filepath = $asset->file_path;
   my $exiftag = $args->{exiftag};
   my $option = $args->{option};
   my $exif_tool = new Image::ExifTool;
   my $exif_info = $exif_tool->ImageInfo($filepath);
   my ($key,$out);

   my @refarray= split(/,/, $exiftag);
   my $exif_tool = new Image::ExifTool;
   my $exif_info = $exif_tool->ImageInfo($filepath,@refarray);
   
   #表(tableあるいはdl)が指定されているときはデータ+表タグ整形して返す
   if ('dl' eq $option){ #table
      $out="<dl>";
      foreach (sort keys %$exif_info){
          $out = $out . "<dt>" . $_  ."</dt><dd>". $$exif_info{$_}."</dd>\n";
      }
      $out= $out ."</dl>";
      return $out;
   }
   elsif ('table' eq $option){ #dlリスト
      $out="<table border=\"1\">";
      foreach (sort keys %$exif_info){
          $out = $out . "<tr><td>" . $_  ."</td><td>". $$exif_info{$_}."</td></tr>\n";
      }
      $out= $out ."</table>";
      return $out;
   }
   
   #表が指定されていないときは単にデータをカンマ(,)で連結して返す
   foreach (sort keys %$exif_info){
      $out = $out . $_  .",". $$exif_info{$_}."\n";
   }

   return $out;
}

# 画像の任意パスを指定してGPS情報をGoogleMapリンクつきで取得するモード
# 単に緯度経度情報だけ欲しいならpositionオプションを渡す
sub _hdlr_gpsposition {
   my ($ctx, $args) = @_;
   my $filepath = $args->{filepath};
   my $option = $args->{option};
   my $out;
   
   #データ取得
   my $exif_tool = new Image::ExifTool;
   my $exif_info = $exif_tool->ImageInfo($filepath);
   my $gps = $exif_info->{GPSPosition};
   
   if(defined $gps){
      $gps =~ s/^(\d*) deg (\d*)\' ([0-9\.]*)\" N, (\d*) deg (\d*)\' ([0-9\.]*)\" E$/$1 $2 $3 $4 $5 $6/;
      my @val = split( / /, $gps );
      my $lat = $val[0] + $val[1] / 60.0 + $val[2] / 3600.0;
      my $long = $val[3] + $val[4] / 60.0 + $val[5] / 3600.0;
      if ('' eq $option or 'googlemap' eq $option){
         #Google地図URL、z=16の部分はズーム
         $out = "<a href=\"http://maps.google.co.jp/maps?q=". $lat. "," . $long . "&z=16\">Google Map</a>\n";
      }
      elsif ('position' eq $option){
         #単なるデータ
         $out = $lat.",".$long;
      }
      return $out;
  }
}

1;

いろいろせつめい

WEBデザインBLOGさんのほうで配布されている、AssetExifプラグインの中で、ExifToolをサーバにインストールしなくても実行できる手法が採用されていたので、こちらもそれを採用(パクッタともいう)してみた。これはいい。(注:yuさんにまだ確認とってないので詳細は伏せるし配布もしない)

AssetExifプラグインは洗練された機能を持っており(詳しくは使っていないが、設定をプラグイン設定ページから自在に操れる)、GPS機能を持っていないので、こちらは差別化した機能を...と思い、大きく分けて以下のような3つの仕様を実装。

  1. 画像の任意パスを渡してExif情報を取得する自由度が非常に高いツールモードの実装
  2. アイテム画像にオプションを渡してさまざまな情報を得るアイテム機能の実装。楽に表組みもできる。
  3. GPS情報より緯度・経度を抽出して、その位置のGoogleMapのURLを取得するモードの実装。

1に関しては、何かと便利な機能なので後々まで残すつもりなんだが、2に関しては、洗練した作りというのが難しいというか...tableのボーダーを指定したいとかdlタグでidやclassを指定したいとか考えるとかなり面倒なんでやめた。3は...yuさんもAssetExifプラグインページで言及されているが、微妙。

簡単な使い方

<p>----------- 1.ツールモード -----------------</p>
<p>画像のパスとURLを生成。</p>
<MTSetVarBlock name="NewestAssetPath">c:\xampp\htdocs\test01\pictures\20090215.jpg</MTSetVarBlock>
<MTSetVarBlock name="NewestAssetURL">http://localhost/test01/pictures/20090215.jpg</MTSetVarBlock>

<p>その画像を表示する</p>
<img src="<MTGetvar name="NewestAssetURL">" />

<p>モデル名が知りたいときのサンプル。値のみを取得なのでvalue。</p>
・<MTGetEXIF filepath="$NewestAssetPath" exiftag="Model" option="value"><br />

<p>モデル名が知りたいときのサンプル。キーと値のペア取得はpair。</p>
・<MTGetEXIF filepath="$NewestAssetPath" exiftag="Model" option="pair"><br />

<p>存在するすべてのEXIF情報(これはexiftagを省略するといい)のキーと値をペアで。</p>
All:<MTGetEXIF filepath="$NewestAssetPath" option="pair"><br />


<p>----------- 2.Assetモード -----------------</p>
<p>メーカー、モデル名、シャッタースピード、ファイル名を取得。テーブルで表組する</p>
<MTAssets type="image">
   <MTGetEXIFAsset exiftag="Make,Model,ShutterSpeed,FileName" option="table"><br />
</MTAssets>

<p>メーカー、モデル名を取得。dlタグで表組する</p>
<MTAssets type="image">
   <MTGetEXIFAsset exiftag="Make,Model" option="dl"><br />
</MTAssets>


<p>----------- 3.GPSモード -----------------</p>
<p>GPS位置。単に緯度経度情報だけならpositionで。</p>
GPS:<MTGetEXIFGpsPosition filepath="$NewestAssetPath" option="position"><br />

<p>Google Mapの地図。googlemapで地図のURLを返す。</p>
GPS:<MTGetEXIFGpsPosition filepath="$NewestAssetPath" option="googlemap"><br />

トラックバック(1)

このブログ記事を参照しているブログ一覧: MT4.2:JPEGファイルのEXIF情報を取得するプラグイン(Ver0.6)

このブログ記事に対するトラックバックURL:

» MovableTypeプラグイン作成に必要な勉強方法について(AssetExifプラグイン制作プロセス) (WEBデザイン BLOG)~のトラックバック

Movable TypeプラグインAssetExifの制作プロセス、はじめてプラグインを制作した人からの必要なリソース、勉強法、気づいた点などついていろい... 続きを読む

2009年11月 2日 11:12

コメントする






Categories
Entries
Feed
スポンサードリンク

parts

フィードメーター - Under the Bridge

あわせて読みたい

なかのひと

2008 yoshi(apstar)