からめもぶろぐ。

SharePoint が得意なフレンズなんだね!すごーい!

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

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

[void][System.Reflection.Assembly]::LoadWithPartialName("System.Drawing")
[void][System.Reflection.Assembly]::LoadWithPartialName("System.IO")

$sourceDir = "<フォルダのパス>"
$destDir = "<フォルダのパス>"

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()

}

EXIFの情報に基づいて画像を回転する - Programming/.NET Framework/Tips - 総武ソフトウェア推進所