MT4.2:JPEGファイルのEXIF情報を取得するプラグイン(GPS Ready)
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"というふうに指定する。
BitsPerSampleColorComponents
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環境での実験結果をそのまま記載。
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では実行できないため確認してませんので、動かなくても文句など受け付けません。
- カテゴリ:215プラグイン関係
トラックバック(3)
このブログ記事を参照しているブログ一覧: MT4.2:JPEGファイルのEXIF情報を取得するプラグイン(GPS Ready)
このブログ記事に対するトラックバックURL:
» movabletype plugin GPS Ready をいじってみた。(WEBデザイン BLOG)~のトラックバック
perlの勉強も兼ねてmovabletype exif情報を抽出するプラグインをちょっと改造してみました。 続きを読む
» Movabletypeプラグイン AssetExifリリースのお知らせ(WEBデザイン BLOG)~のトラックバック
はじめてのMovableTypeプラグインをリリースします。AssetExifプラグイン。イメージファイルからExif情報(写真撮影時の絞り・シャッタース... 続きを読む
» MovableTypeプラグイン作成に必要な勉強方法について(AssetExifプラグイン制作プロセス) (WEBデザイン BLOG)~のトラックバック
Movable TypeプラグインAssetExifの制作プロセス、はじめてプラグインを制作した人からの必要なリソース、勉強法、気づいた点などついていろい... 続きを読む
- Categories
- Entries
-
- Feed情報の無いサイトの更新日時を得るプラグイン(2)
- Feed情報の無いサイトの更新日時を得るプラグイン
- MT4.2:JPEGファイルのEXIF情報を取得するプラグイン(Ver0.6)
- EXIF情報を取得するプラグインの進行状況
- MT4.2:JPEGファイルのEXIF情報を取得するプラグイン(Ver0.5)
- MT4.2:JPEGファイルのEXIF情報を取得するプラグイン(Ver0.4)
- memo:perlでプラグイン Image::ExifとImage::Info
- MT4.2:JPEGファイルのEXIF情報を取得するプラグイン(Ver0.3)
- MT4.2:JPEGファイルのEXIF情報を取得するプラグイン(Ver0.2)
- MT4.2:JPEGファイルのEXIF情報を取得するプラグイン(GPS Ready)
- MT4:エントリのURLをQRコードで自動生成する
- MT4.2:QRコード画像を生成するプラグイン(改)
- 嵌りメモ(perlのxampp環境でのファイル吐き出し実験)
- MT4.2:QRコード画像を生成するプラグイン
- MT4.2:JPEGファイルのEXIF情報を取得するプラグイン(失敗)
- 管理画面を拡張する(メニューとメソッド追加)
- MT4.1:追加したファンクションタグのみへモデファイア追加
- MT4.1:エントリの既存DBへアクセスしてデータ取得
- MT4.1:MTの計算機能を拡張するプラグイン(CalcExp)開発の話
- MT4.1:MTの計算機能を拡張するプラグイン(CalcExp)配布
- MT4.1:営業日(休日)をイッパツで表現するカレンダープラグイン(改)
- MT4.1:プラグイン作成におけるDBへのフィールド追加について(プラグイン設定編)
- MT4.1:プラグイン作成におけるDBへのフィールド追加について(ブログ毎編)
- MT4.1:プラグイン作成におけるDBへのフィールド追加について(カテゴリ編)
- MT4.1:プラグイン作成におけるDBへのフィールド追加について(エントリ編)
- MT4.1:カテゴリの並べ替え(オリジナルプラグイン+ハッシュ変数)
- サンプルプラグインを手入力した(AddField)
- MT4.1:営業日(休日)をイッパツで表現するカレンダープラグイン
- サンプルプラグインを手入力した(RandomEntry)
- 最小単位のプラグインを生成するサンプル(ファンクション、ブロック、モデファイア、コールバック)
コメント(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は、いまローカル環境でも十分な実験できるんで申請はしていません。でもそのうちすると思います。
コメントする