デジカメの時計、ずれていることが良くある。
先日も11分進んでいた。
デジカメだけ使うのであれば何とかなるが、これにスマホで撮った写真が混在すると、時系列がめちゃめちゃになってしまい
整理するのが面倒。
そこで、JPEGファイルの更新日時・Exifの撮影日時を一括で補正するツールを考えてみる。
※ 前回記事:JPEG時刻補正ツールを作る #1
先日も11分進んでいた。
デジカメだけ使うのであれば何とかなるが、これにスマホで撮った写真が混在すると、時系列がめちゃめちゃになってしまい
整理するのが面倒。
そこで、JPEGファイルの更新日時・Exifの撮影日時を一括で補正するツールを考えてみる。
※ 前回記事:JPEG時刻補正ツールを作る #1
本文中の "$" は半角で読み替えること。
掲載したプログラムは自己責任でご使用ください。
ソースコード
作成したソースコード(JpegTimeCorrection.ps1)は以下の通り。
Param (
[Parameter(mandatory=$true)][String]$inputDir,
[Parameter(mandatory=$true)][String]$outputDir,
[Parameter(mandatory=$true)][Int]$CorrectionValue
)
Add-Type -AssemblyName "System.Drawing"
# 既に$idで指定したPropertyItemが存在する場合、そのPropertyItemは削除する。
# $imageオブジェクトより先頭のPropertyItemオブジェクトを返す。
function GetPropertyItem($image, $id)
{
$item = $image.PropertyItems | Where-Object { $_.Id -eq $id }
if($item -ne $null) {
$image.RemovePropertyItem($id)
}
return $image.PropertyItems | Select-Object -First 1
}
# $imageオブジェクトにPropertyItemを登録する。
function SetPropertyItem($image, $id, $len, $type, $value)
{
$item = GetPropertyItem -image $image -id $id
$item.Id = $id
$item.Len = $len
$item.Type = $type
$item.Value = $value
$image.SetPropertyItem($item)
}
# $dateTimeで指定した撮影日時よりExif用配列データを取得する。
function getDateTimeValue($dateTime)
{
$chars = $dateTime.ToString("yyyy:MM:dd HH:mm:ss").ToCharArray()
$ascii = @()
foreach($char in $chars)
{
$ascii += [Byte][Char]$char
}
$ascii += 0
return $ascii
}
# $imageオブジェクトに撮影日時PropertyItemを登録する。
function SetDateTime($image, $dateTime)
{
$value = getDateTimeValue -dateTime $dateTime
SetPropertyItem -image $image -id 0x9003 -len 20 -type 2 -value $value
SetPropertyItem -image $image -id 0x9004 -len 20 -type 2 -value $value
}
# 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
}
# メイン処理
$files = Get-ChildItem -Path $inputDir\*.* -Include *.jpg,*.jpeg
foreach ($file in $files)
{
try {
$fileDate = (Get-ItemProperty -Path $file).LastWriteTime.AddMinutes($CorrectionValue)
$outputFile = SetExifInfo -inputFile $file.FullName -outputDir $outputDir -dateTime $fileDate
Set-ItemProperty $outputFile -Name LastWriteTime -Value $fileDate
Write-Host( "[OK] " + $file.Name + " " + $fileDate)
} catch {
Write-Host( "[ER] " + $file.Name + "`r`n" + $_)
}
}
# ここまで
使い方
PowerShellで実行する。
書式:
入力先 D:\temp\input、出力先 D:\temp\oupput、補正値 -11分 とする場合、
※ 過去記事:PowerShell学習 #2:スクリプトを実行するには?
書式:
./JpegTimeCorrection.ps1 (入力パス) (出力パス) (補正値)例:
入力先 D:\temp\input、出力先 D:\temp\oupput、補正値 -11分 とする場合、
./JpegTimeCorrection.ps1 D:\temp\input D:\temp\output -11PowerShellでスクリプトを実行するには権限変更が必要である。以下記事を参考してください。
※ 過去記事:PowerShell学習 #2:スクリプトを実行するには?
次作プログラム, PowerShell, Exif
0 件のコメント:
コメントを投稿