📸
PowerShell で iPhone の画像の回転を元に戻す
iPhone で撮影した写真は縦横が逆になってしまうことがあるらしく、検索すれば情報はいっぱい出てくるのですが、要するに Exif 情報を認識して回転してくれないことが原因のようです。煩わしいので Exif に従って画像ごと回転してしまいたいです。C# では情報が見つかったものの、C# で書くほどでもないので、PowerShell で書いてみました。これを .ps1
ファイルにして実行すれば解決です。
[void][System.Reflection.Assembly]::LoadWithPartialName("System.Drawing")
[void][System.Reflection.Assembly]::LoadWithPartialName("System.IO")
$sourceDir = "{{source-folder}}"
$destDir = "{{dest-folder}}"
foreach ($sourceFile in [System.IO.Directory]::GetFiles($sourceDir, "*")) {
$destFile = [System.IO.Path]::Combine($destDir, [System.IO.Path]::GetFileName($sourceFile))
$origin = New-Object System.Drawing.Bitmap($sourceFile)
$rotation = [System.Drawing.RotateFlipType]::RotateNoneFlipNone
foreach ($item in $origin.PropertyItems) {
if ($item.Id -eq 274) {
if ($item.Value[0] -eq 3) {
$rotation = [System.Drawing.RotateFlipType]::Rotate180FlipNone
}
if ($item.Value[0] -eq 6) {
$rotation = [System.Drawing.RotateFlipType]::Rotate90FlipNone
}
if ($item.Value[0] -eq 8) {
$rotation = [System.Drawing.RotateFlipType]::Rotate270FlipNone
}
}
}
$rotated = [System.Drawing.Bitmap]$origin.Clone()
$rotated.RotateFlip($rotation)
foreach ($item in $origin.PropertyItems) {
if ($item.Id -eq 274) {
$item.Value[0] = 0
$rotated.SetPropertyItem($item)
}
}
$rotated.Save($destFile, [System.Drawing.Imaging.ImageFormat]::Jpeg)
$origin.Dispose()
$rotated.Dispose()
}
Discussion