JPEG時刻補正ツールを作る #1

デジカメの時計がズレてことが良くある。
先日も11分進んでいた。
デジカメだけ使うのであれば何とかなるが、これにスマホで撮った写真が混在すると、
時系列がめちゃめちゃになってしまい後で整理するのが面倒。
そこで、JPEGファイルの更新日時・EXIFの撮影日時を一括で補正するツールを考えてみる。


仕様

PowerShellでJPEGファイルの日付を補正するツールを作成する。

起動方法:
JpegTimeCorrection.ps1 (JPEGファイルパス $inputDir) (出力先パス $outputDir) (補正値 $correctionValue)

ファイル一覧取得

JPEGファイル一覧の取得はGet-ChildItemコマンドレットを使用する。
入力パス(-Path)は $inputDir\*.*、対象の拡張子(-Include)は "*.jpg" と "*.jpeg" とする。
サブフォルダは対象外とする。
取得したファイル一覧を $files へ格納する。
  $files = Get-ChildItem -Path $inputDir -Include *.jpg,*.jpeg
  

メインループ

取得した $files を1ファイルずつループする。
ループ中のファイル名を $file に格納する。
ループ内にメイン処理を記述する。
メイン処理で発生した例外を try - catch でキャッチし、成功可否を画面表示する。
  foreach ($file in $files)
  {
    try {
    # メイン処理 #
    Write-Host( "[OK] " + $file.Name)
    } catch {
    Write-Host( "[ER] " + $file.Name + "`r`n" + $_)
    }
  }
  

更新日時取得

ループ中ファイル名の更新日時を取得し $fileDate へ格納する。
  $fileDate = (Get-ItemProperty -Path $file).LastWriteTime
  

時刻の加減算

取得した更新日時の"分"に引数の $correctionValue を加算する。
$correctionValue に負数を指定すれば減算となる。
※ 過去記事:PowerShell:時刻の加算・減算
  $fileDate = (Get-ItemProperty -Path $file).LastWriteTime.AddMinutes($correctionValue)
  

Exif情報変更

ループ中ファイルの撮影日時を、先ほど計算した更新日時に変更する。
万が一、元のファイルが壊れるかもしれないので、引数 $outputDir で指定した場所にコピーしたファイルに対して変更を行う。
この処理は、過去に作成した "JPEG更新日時一括変換ツール (ChangeJpegDate.ps1)" の SetExifInfo関数を流用するが、Exif情報は既に存在している事を前提とするため、ExifVersionを追加する処理(SetExifVersion関数の呼び出し)はコメントアウトする。
※ 過去記事:JPEG更新日時一括変更ツールを作る #6
  # Exif情報登録
  # $inputFileで指定したファイルに$dateTimeで指定したExif撮影日時を付加し$outputDirへ保存する。
  # 保存したファイルのフルパスを返す。
  function SetExifInfo($inputFile, $outputDir, $dateTime)
  {
    $image = New-Object System.Drawing.Bitmap($inputFile)
    # SetExifVersion -image $image
    SetDateTime -image $image -dateTime $dateTime
  
    $outputFile = Join-Path $outputDir (Split-Path $inputFile -Leaf)
    $image.Save($outputFile)
  
    $image.Dispose()
  
    return $outputFile
  }
  

更新日時変更

メイン処理よりExif情報変更(SetExifInfo関数の呼び出し)を行い。
関数の戻り値として、$outputDir へ保存したフルパスが返るので、このパスに対して更新日時の変更を行う。
この処理も、過去に作成した "JPEG更新日時一括変換ツール (ChangeJpegDate.ps1)" の メイン処理と同じである。
※ 過去記事:JPEG更新日時一括変更ツールを作る #6
※ 過去記事:PowerShell:ファイル更新日時の取得および設定

メイン処理は以下のようになる。
  $fileDate = (Get-ItemProperty -Path $file).LastWriteTime.AddMinutes($CorrectionValue)
  $outputFile = SetExifInfo -inputFile $file.FullName -outputDir $outputDir -dateTime $fileDate
  Set-ItemProperty $outputFile -Name LastWriteTime -Value $fileDate
  

※ 次回記事:JPEG時刻補正ツールを作る #2


次作プログラム, PowerShell, Exif

0 件のコメント:

その他の記事