Under the Bridge

a Picture of the Late Him

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

2009年2月15日 17:35 | Writer: yoshi | 記事本文 | コメント(2) | トラックバック(3)

JPEGファイルにはEXIF情報というデータが埋め込まれている。これを用い、エントリを投稿したときにアップロードした画像のシャッタースピード、撮影日時、カメラのメーカー、モデル名、GPS情報などを利用できるようになる。

EXIF情報とは。

1994年に富士フィルムが提唱したデジタルカメラ用の画像ファイルの規格。JEIDAによって標準化され、各社のデジタルカメラに採用されている。最新版はExif 2.2(Exif Print)。TIFF形式で画像についての情報や撮影日時などの付加情報を記録できるほか、縮小画像(サムネイル)を記録することができる。画像形式はRGB無圧縮方式やJPEG方式など複数の形式をサポートしている。

こんなケースで使えるかも

フォトログなどで、使用したカメラの機種やシャッタースピードなどの情報を記載したいが、イチイチ調べて記述したくない面倒くさがりやさんへいいかと。GPS情報を取得してGoogleマップと連携なんていう手もアリかもしれない(できるかどうかは今の時点では知らない)。

準備

perlモジュールとしてImage::ExifToolを用いる。

※実は私の使用しているCORESERVERは、このモジュールが入っていないぽい。なので以下の記事は全てXAMPPのローカル環境で試した記事である。

そしてプラグインを準備する。プラグインコードは意に反してとっても短い。これにgetexif.plなどと名前をつけて、pulginsディレクトリへ投げ込めばOK。

package MT::Plugin::GetEXIF;
use strict;
use MT::Plugin;
use base qw(MT::Plugin);
our $VERSION = '0.1';
use Image::ExifTool;
use MT::Template::Context;

my $plugin = new MT::Plugin::GetEXIF({
    id => 'GetEXIF',
    key => 'get_exif',
    name => 'GetEXIF',
    version => $VERSION,
    description => 'GetEXIF',
    author_name => 'apstar',
    author_link => 'http://www.mtde.info/',
});
MT->add_plugin($plugin);

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

sub _hdlr_getexif {
my ($ctx, $args) = @_;
my $filepath = $args->{filepath};
my $option = $args->{option};
my $exif_tool = new Image::ExifTool;
my $exif_info = $exif_tool->ImageInfo($filepath);

my $key;
my $out;
for $key (sort keys %$exif_info){
   if ($key eq $option) {
      $out = $$exif_info{$key};
   }
}

return $out;

}

1;

MT側のコード

QRコード生成プラグインなどと同じく、画像ファイルを扱う際は、画像ファイルのURLではなく画像のパスを用いなければいけないぽい。

コードの記述自体は、すごく簡単である。例えば、シャッタースピードが取得したければ、filepathに画像ファイルのパス、optionにShutterSpeedと指定すればいい。

<MTAssets lastn="1">
<MTSetVarBlock name="NewestAssetURL"><MTAssetFilePath></MTSetVarBlock>
</MTAssets>
ShutterSpeed:<MTGetEXIF filepath="$NewestAssetURL" option="ShutterSpeed"><br />

optionのパラメータの種類

現在わかっているものだけで50種類ちょっと。ほかにもありそう。今のところ、私の持つ携帯カメラ(GPS機能内蔵)での実験では、以下の情報は大丈夫ぽい。option="BitsPerSample"というふうに指定する。

BitsPerSample
ColorComponents
ColorSpace
ComponentsConfiguration
CustomRendered
DateTimeOriginal
DigitalZoomRatio
Directory
EncodingProcess
ExifByteOrder
ExifImageHeight
ExifImageWidth
ExifToolVersion
ExifVersion
ExposureMode
ExposureTime
FileModifyDate
FileName
FileSize
FileType
Flash
FlashpixVersion
ImageDescription
ImageHeight
ImageSize
ImageWidth
JFIFVersion
MIMEType
Make
Model
Orientation
ResolutionUnit
ResolutionUnit (1)
SceneCaptureType
ShutterSpeed
WhiteBalance
XResolution
XResolution (1)
YCbCrPositioning
YCbCrSubSampling
YResolution
YResolution (1)
GPSLatitude
GPSLatitude (1)
GPSLatitudeRef
GPSLongitude
GPSLongitude (1)
GPSLongitudeRef
GPSMapDatum
GPSPosition
GPSProcessingMethod
GPSVersionID

実験用コード

実験用コードを貼っておく。最新のAsset画像からさまざまなEXIF情報を取得するコードサンプル。

<MTAssets lastn="1">
<MTSetVarBlock name="NewestAssetURL"><MTAssetFilePath></MTSetVarBlock>
</MTAssets>
<p>Get Datas</p>
BitsPerSample:<MTGetEXIF filepath="$NewestAssetURL" option="BitsPerSample"><br />
ColorComponents:<MTGetEXIF filepath="$NewestAssetURL" option="ColorComponents"><br />
ColorSpace:<MTGetEXIF filepath="$NewestAssetURL" option="ColorSpace"><br />
ComponentsConfiguration:<MTGetEXIF filepath="$NewestAssetURL" option="ComponentsConfiguration"><br />
CustomRendered:<MTGetEXIF filepath="$NewestAssetURL" option="CustomRendered"><br />
DateTimeOriginal:<MTGetEXIF filepath="$NewestAssetURL" option="DateTimeOriginal"><br />
DigitalZoomRatio:<MTGetEXIF filepath="$NewestAssetURL" option="DigitalZoomRatio"><br />
Directory:<MTGetEXIF filepath="$NewestAssetURL" option="Directory"><br />
EncodingProcess:<MTGetEXIF filepath="$NewestAssetURL" option="EncodingProcess"><br />
ExifByteOrder:<MTGetEXIF filepath="$NewestAssetURL" option="ExifByteOrder"><br />
ExifImageHeight:<MTGetEXIF filepath="$NewestAssetURL" option="ExifImageHeight"><br />
ExifImageWidth:<MTGetEXIF filepath="$NewestAssetURL" option="ExifImageWidth"><br />
ExifToolVersion:<MTGetEXIF filepath="$NewestAssetURL" option="ExifToolVersion"><br />
ExifVersion:<MTGetEXIF filepath="$NewestAssetURL" option="ExifVersion"><br />
ExposureMode:<MTGetEXIF filepath="$NewestAssetURL" option="ExposureMode"><br />
ExposureTime:<MTGetEXIF filepath="$NewestAssetURL" option="ExposureTime"><br />
FileModifyDate:<MTGetEXIF filepath="$NewestAssetURL" option="FileModifyDate"><br />
FileName:<MTGetEXIF filepath="$NewestAssetURL" option="FileName"><br />
FileSize:<MTGetEXIF filepath="$NewestAssetURL" option="FileSize"><br />
FileType:<MTGetEXIF filepath="$NewestAssetURL" option="FileType"><br />
Flash:<MTGetEXIF filepath="$NewestAssetURL" option="Flash"><br />
FlashpixVersion:<MTGetEXIF filepath="$NewestAssetURL" option="FlashpixVersion"><br />
ImageDescription:<MTGetEXIF filepath="$NewestAssetURL" option="ImageDescription"><br />
ImageHeight:<MTGetEXIF filepath="$NewestAssetURL" option="ImageHeight"><br />
ImageSize:<MTGetEXIF filepath="$NewestAssetURL" option="ImageSize"><br />
ImageWidth:<MTGetEXIF filepath="$NewestAssetURL" option="ImageWidth"><br />
JFIFVersion:<MTGetEXIF filepath="$NewestAssetURL" option="JFIFVersion"><br />
MIMEType:<MTGetEXIF filepath="$NewestAssetURL" option="MIMEType"><br />
Make:<MTGetEXIF filepath="$NewestAssetURL" option="Make"><br />
Model:<MTGetEXIF filepath="$NewestAssetURL" option="Model"><br />
Orientation:<MTGetEXIF filepath="$NewestAssetURL" option="Orientation"><br />
ResolutionUnit:<MTGetEXIF filepath="$NewestAssetURL" option="ResolutionUnit"><br />
ResolutionUnit (1):<MTGetEXIF filepath="$NewestAssetURL" option="ResolutionUnit (1)"><br />
SceneCaptureType:<MTGetEXIF filepath="$NewestAssetURL" option="SceneCaptureType"><br />
ShutterSpeed:<MTGetEXIF filepath="$NewestAssetURL" option="ShutterSpeed"><br />
WhiteBalance:<MTGetEXIF filepath="$NewestAssetURL" option="WhiteBalance"><br />
XResolution:<MTGetEXIF filepath="$NewestAssetURL" option="XResolution"><br />
XResolution (1):<MTGetEXIF filepath="$NewestAssetURL" option="XResolution (1)"><br />
YCbCrPositioning:<MTGetEXIF filepath="$NewestAssetURL" option="YCbCrPositioning"><br />
YCbCrSubSampling:<MTGetEXIF filepath="$NewestAssetURL" option="YCbCrSubSampling"><br />
YResolution:<MTGetEXIF filepath="$NewestAssetURL" option="YResolution"><br />
YResolution (1):<MTGetEXIF filepath="$NewestAssetURL" option="YResolution (1)"><br />
GPSLatitude:<MTGetEXIF filepath="$NewestAssetURL" option="GPSLatitude"><br />
GPSLatitude (1):<MTGetEXIF filepath="$NewestAssetURL" option="GPSLatitude (1)"><br />
GPSLatitudeRef:<MTGetEXIF filepath="$NewestAssetURL" option="GPSLatitudeRef"><br />
GPSLongitude:<MTGetEXIF filepath="$NewestAssetURL" option="GPSLongitude"><br />
GPSLongitude (1):<MTGetEXIF filepath="$NewestAssetURL" option="GPSLongitude (1)"><br />
GPSLongitudeRef:<MTGetEXIF filepath="$NewestAssetURL" option="GPSLongitudeRef"><br />
GPSMapDatum:<MTGetEXIF filepath="$NewestAssetURL" option="GPSMapDatum"><br />
GPSPosition:<MTGetEXIF filepath="$NewestAssetURL" option="GPSPosition"><br />
GPSProcessingMethod:<MTGetEXIF filepath="$NewestAssetURL" option="GPSProcessingMethod"><br />
GPSVersionID:<MTGetEXIF filepath="$NewestAssetURL" option="GPSVersionID"><br />

実行結果

私のケータイ電話にはGPS機能があり、それを撮影したjpsgファイルに埋め込むことが出来る。それで撮影した、自室の散乱する酒瓶w

※XAMPP環境での実験結果をそのまま記載。

20090215.jpg
BitsPerSample:8
ColorComponents:3
ColorSpace:sRGB
ComponentsConfiguration:YCbCr
CustomRendered:Normal
DateTimeOriginal:2009:02:15 17:55:06
DigitalZoomRatio:1.333333333
Directory:C:\xampp\htdocs\mtcs-test\images
EncodingProcess:Baseline DCT, Huffman coding
ExifByteOrder:Big-endian (Motorola)
ExifImageHeight:320
ExifImageWidth:240
ExifToolVersion:7.15
ExifVersion:0220
ExposureMode:Auto
ExposureTime:1/14
FileModifyDate:2009:02:15 17:58:11
FileName:090215_1755~0001.jpg
FileSize:24 kB
FileType:JPEG
Flash:Off
FlashpixVersion:0100
ImageDescription:090215_1755~0001
ImageHeight:320
ImageSize:240x320
ImageWidth:240
JFIFVersion:
MIMEType:image/jpeg
Make:KDDI-CA
Model:A5513CA
Orientation:Horizontal (normal)
ResolutionUnit:inches
ResolutionUnit (1):
SceneCaptureType:Standard
ShutterSpeed:1/14
WhiteBalance:Auto
XResolution:72
XResolution (1):
YCbCrPositioning:Centered
YCbCrSubSampling:YCbCr4:2:0 (2 2)
YResolution:72
YResolution (1):
GPSLatitude:33 deg 39' 23.26" N
GPSLatitude (1):33 deg 39' 23.26"
GPSLatitudeRef:North
GPSLongitude:130 deg 27' 29.01" E
GPSLongitude (1):130 deg 27' 29.01"
GPSLongitudeRef:East
GPSMapDatum:WGS-84
GPSPosition:33 deg 39' 23.26" N, 130 deg 27' 29.01" E
GPSProcessingMethod:GPS-FIX
GPSVersionID:2.2.0.0

後記

ちなみに、他にも何か情報が無いかを探りたい場合はプラグイン中のコードを以下のものに変え、一回のみコールするといい。再構築後のhtml上へEXIF情報がずらーっとでてきます。

for $key (sort keys %$exif_info){
#   if ($key eq $option) {
      $out .=$key."/" .$$exif_info{$key};
#   }
}

私の使用するCORESERVERでは実行できないため確認してませんので、動かなくても文句など受け付けません。

トラックバック(3)

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

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

» movabletype plugin GPS Ready をいじってみた。(WEBデザイン BLOG)~のトラックバック

perlの勉強も兼ねてmovabletype exif情報を抽出するプラグインをちょっと改造してみました。 続きを読む

2009年2月21日 09:37

» Movabletypeプラグイン AssetExifリリースのお知らせ(WEBデザイン BLOG)~のトラックバック

はじめてのMovableTypeプラグインをリリースします。AssetExifプラグイン。イメージファイルからExif情報(写真撮影時の絞り・シャッタース... 続きを読む

2009年5月 5日 08:20

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

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

2009年11月 2日 11:12

コメント(2)

yu (2009年2月17日 03:14)

どうもご無沙汰しています。
あれー前回の記事(失敗)を見て、自分で作ってみようと思っていたんですけど、
できちゃったんですね。
参考にさせていただきます。
my $filepath = $args->{filepath};がファイルパスのパラメーターになるのですね。
filebase
ExifToolのkeyをそのままテンプレートタグにすることができると楽っぽいですね。
CORESERVERであれば、フォーラムからモジュール追加の申請をしてみるといいかもしれないです。
サーバに負担をかけないモジュールであれば、追加されると思います。

yoshi (2009年2月17日 19:42)

お久しぶりです。

my $filepath = $args->{filepath};
それと
$out = $key.":".$$exif_info{$key}."<br />\n";
ありがとうございます。

>ExifToolのkeyをそのままテンプレートタグにすることができると楽っぽいですね。
うーん。プラグインコードは大きくなりそうな予感がします。今はモデファイアにしているので、keyが未知の値でも何とか対応できると思うのです。
でもExifToolのkeyをそのまま(場合によっては端折って)テンプレートタグにすることは、ユーザにとっては使うのがすごく簡単かもしれないですね。検討してみます。

CORESERVERは、いまローカル環境でも十分な実験できるんで申請はしていません。でもそのうちすると思います。

コメントする






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

parts

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

あわせて読みたい

なかのひと

2008 yoshi(apstar)