📸

PowerShell で iPhone の画像の回転を元に戻す

2022/01/01に公開

iPhone で撮影した写真は縦横が逆になってしまうことがあるらしく、検索すれば情報はいっぱい出てくるのですが、要するに Exif 情報を認識して回転してくれないことが原因のようです。煩わしいので Exif に従って画像ごと回転してしまいたいです。C# では情報が見つかったものの、C# で書くほどでもないので、PowerShell で書いてみました。これを .ps1 ファイルにして実行すれば解決です。

https://smdn.jp/programming/netfx/tips/rotate_image_by_exif_info

[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