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 でも動くように試して見ようと思います。

同じカテゴリーの記事

このページの一番上に戻る
  • Facebook
  • Twitter
  • Tumblr
  • Instagram
  • miil