Creazy!

WEBエンジニア・ヤガーのテック・ガジェットブログ

camera VQ1005

VQ1005で撮影したJPEG画像のタイムスタンプをPHP Exif Libraryで一括変換

投稿日:


IMG_0079.JPG
少し前にトイデジLovers!という本を読んでからというもの、VQ1005の再ブーム到来って感じです。自分だけw
で、すごい今更だと思うのですが、ちょっと便利な方法を紹介します。
VQ1005(とそのファミリー)で撮影した写真画像はなぜかEXIF上のタイムスタンプ(撮影日付)が固定なんですね。データとして、いつ撮ったものか分かんなくなっちゃうんです。ええ〜そんなバカな!と思うかもしれないけど、それがあるのがトイデジの魅力でもあったりw
で、ファイルを整理するのにフォルダを分けたり自分で工夫しないといけなかったりするのですが、Flickrとかにアップする場合はやっぱりタイムスタンプどうにかしたいなと。で、PHPでバッチ処理させて一気にタイムスタンプを書き換える方法を編み出したので共有します。
※Macでしか動作確認していません。WIndowsでも同じ用な事ができると思うんですが…。

PHP Exif Library

EXIFデータの読み込みだけであれば、exif_read_dataで事足りるのですが、今回はEXIFの書き換えをしたいので、PEL: PHP Exif Libraryを使う事にしました。
PELについてはこちらに詳細な解説があったので参考にしました。
PHPでExifを操作する – PHPプロ!TIPS+
こちらのページからソースをダウンロードしてきて、適当なフォルダに展開しておいてください。
※この記事執筆時点でバージョンは0.9.1でした。

MacPortsでPHPをインストール

MacにはデフォルトでPHPが入っているのですが、PELを使って開発をしている時にjdtounix関数でエラーが発生しました。つまり、カレンダー関連ライブラリがインストールされてないのですね。
なので、改めてMacPortsからインストールしました。
※MacPortsのインストール手順は省略。ググってください。
PHPのコンパイルオプションにcalendarを加えるために、port editします。

$ sudo port edit php5
--enable-calendar をconfigure optionに追加

そして、改めてPHPをインストール

$ sudo port install php5

これでOK

EXIFを書き換えるPHPソース

こんなスクリプトを書いてみました。

<?php
require_once('pel/PelJpeg.php');
$filenames = array();
$timestamp = null;
// Parameter
if ( empty($argv) || count($argv) <= 1 ) {
die("invalid parameter: php -f ".$_SERVER['PHP_SELF']." [filename] ([datetime Y-m-d H:i:s])\n");
}
foreach ( $argv as $param ) {
if ( $param == $_SERVER['PHP_SELF'] ) continue;
if ( preg_match('/^([0-9]{4}-[0-9]{2}-[0-9]{2}|[0-9]{4}\/[0-9]{2}\/[0-9]{2})/',$param) ) {
$timestamp = strtotime($param);
}
else if ( preg_match('/(jpg|jpeg|tiff)$/i',$param) ) {
array_push($filenames, $param);
}
}
echo "### Changing EXIF DateTimeOriginal ###\n";
foreach ( $filenames as $filename ) {
changeDateTimeOriginal($filename, $timestamp);
}
/**
* changeDateTimeOriginal
*/
function changeDateTimeOriginal($filename, $timestamp) {
if ( !$timestamp ) {
$timestamp = filectime($filename);
}
echo "filename     : " . $filename . "\n";
echo "new timestamp: " . date('Y:m:d H:i:s',$timestamp) . "\n";
$timestamp += 9 * 3600; // JST +9:00
$jpeg = new PelJpeg($filename);
$app1 = $jpeg->getExif();
if ($app1) {
$tiff = $app1->getTiff();
$ifd0 = $tiff->getIfd();
if ($ifd0) {
$exif = $ifd0->getSubIfd(PelIfd::EXIF);
$new_timestamp = $exif->getEntry(PelTag::DATE_TIME_ORIGINAL);
if (!$new_timestamp) {
$new_timestamp = new PelEntryTime($timestamp, PelEntryTime::UNIX_TIMESTAMP);
$exif->addEntry($new_timestamp);
} else {
$new_timestamp->setValue($timestamp,PelEntryTime::UNIX_TIMESTAMP);
}
file_put_contents($filename, $jpeg->getBytes());
echo "Done!\n";
} else {
echo "Failed!\n";
}
}
}
?>

これを、exif_date_setter.php という名前で保存しました。
先にダウンロードしておいたPELライブラリとの構成は下記の通り。

/path/to/script/
+-- pel/
+-- exif_date_setter.php

で、実行するとこんな感じに。

$ /opt/local/bin/php -f exif_date_setter.php ~/Pictures/2009/200903/20090326_vq1005/* "2009-03-26 00:00:00"
### Changing EXIF DateTimeOriginal ###
filename     : /Users/yager/Pictures/2009/200903/20090326_vq1005/IMG_0071.JPG
new timestamp: 2009:03:26 00:00:00
Done!

コマンドの引数は下記の通り。

$ php -f exif_date_setter.php [ファイル名(*ワイルドカード指定可能)] [タイムスタンプ(YYYY-MM-DD HH:MI:SS)]

タイムスタンプを省略すると、指定した画像ファイルのタイムスタンプ(PCに保存した日付)が設定されます。撮影日がハッキリしている場合は、第2引数で日付を強制的に指定できます。

さらに便利にするためにショートカット

ちょっとコマンドが長いのでエイリアスを作っておきます。

$ alias vq1005="/opt/local/bin/php -f /path/to/script/exif_date_setter.php"

こうしておくと、

$ vq1005 [ファイル名] [タイムスタンプ]

といった感じでサクッと日付変更できるので便利です。
で、これを .bash_profile か何かに書いとけばOK。

$ vi ~/.bash_profile
alias vq1005="/opt/local/bin/php -f /path/to/script/exif_date_setter.php"
の行を足して保存。

まとめ

EXIFの編集って画像ソフトとかでもできるんだろうけど、それだけのために一々アプリケーション起動したくなかったので、こんな方法になってしまいました。VQ1005ユーザーの方にはもしかしたら優しくない記事だよなぁ 🙁
ちなみにこれが、
Flickr EXIF
このスクリプトで日付変更した画像をFlickrにアップロードして、詳細情報を確認した画面です。
「Date Time Original」だけ書き変わって、「Modified」「Digitized」は古いままである事が分かります。ただ、Flickrの撮影日付(taken on)は「Date Time Original」で見ているので、これでちゃんとカレンダーArchiveにも表示されます。
要望が多ければ Windows でも動くように試して見ようと思います。

-camera, VQ1005

執筆者:


comment

メールアドレスが公開されることはありません。

関連記事

革のカメラストラップ購入/これプレゼントに良いかも!

ずっと、カメラ(E-300)が壊れてて忘れてましたがつい先日E-520を買って思い出しました。去年の11月、自分の誕生日にカメラストラップを買ったのでした。ずっと、付属のストラップを使ってたんですが、 …

新しい三脚「SLIK F740」が届きました

シルバーウィーク真っ最中ですが、今日はお出かけの中日ということで休養日にあてています。 そんな日に一つAmazonから宅配便が届きました。 SLIK 三脚 F740 新しい三脚を注文していたのでした。 …

VQ1005を「速写」&「省エネ」仕様に改造

1台しか買ってないので失敗した時のリスクを考えて改造するか迷っていたんだけど、自分の腕を信じてやってみる事にしました。VQ1005では定番ぽい、「速写」と「省エネ」の改造です。 いきなり完成図からのせ …

SIGMA(シグマ) 30mm F1.4 EX DC HSM(フォーサーズ)が届きました

先日、つぶやいていたばかりですがやっぱり買いました。 しかし、新しいレンズ欲しい! via: 単焦点の明るいレンズが欲しいのですが・・・ そして、早くも今日注文していたレンズが届いたのです。 カワイイ …

VQ1005の盛り上がりと活発なコミュニティ

人気が出過ぎて深刻な品薄状態が続いており、売りであるはずの味のある写真が *撮れない* 新版(それはGenieの話だけど)まで出回り始めたVQ1005ですが、みなさんもう手に入れました? 最近ではブロ …

スポンサードリンク

スポンサードリンク