管理人Kのひとりごと

デジモノレビューやプログラミングや写真など

画像を回転させたい

現在サブで使ってるPentaxQ10は画像自動回転機能がなく、縦画像は手動で回転させる必要がありました。これをなんとかできないかなーと、Powershellで書いてみることにしました。
.Netのアセンブリを多用する結果となりましたが、なんとか完成。引数判定や、画像ファイル判定、例外処理が足りてませんが、とりあえず動いてます。
以下ソース。

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

# メイン処理
# 引数1 :元画像ファイルのフルパス
# 引数2 :回転角度(90,180,270)
# 戻り値:<元ファイルのパス>「rotated+回転角度」<元ファイルの拡張子>
function GetNewFileName($originalFileName,$flip){
  # 元画像の格納ディレクトリを取得
  $path = [System.IO.Path]::GetDirectoryName($originalFileName);

  # 元画像のファイル名(拡張子除く)を取得
  $originalName = [System.IO.Path]::GetFileNameWithoutExtension($originalFileName);
  
  # 元画像の拡張子を取得(ピリオドは含まれる)
  $extensionName = [System.IO.Path]::GetExtension($originalFileName);
  
  # 回転後のファイル名(拡張子あり)を作成
  $newName = $originalName + "_rotated" + $flip + $extensionName

  # 新ファイルパスを作成してリターン
  return [System.IO.Path]::Combine($path,$newName);
}

# メイン処理
# 引数1 :回転角度(時計回りに -90,-180,-270)
# 引数2 :元画像ファイルのフルパス
# 戻り値:なし
function Main($rotate,$originalFileName){
  # 元画像取得
  $sourceImage = [System.Drawing.Image]::FromFile($originalFileName);
  
  # 元画像の複製作成(回転対象はこちらの画像)
  $rotatedImage = [System.Drawing.Image]$sourceImage.Clone();
  
  $flip = 0
  # 回転(時計回りで90,180,270と回転)
  if($rotate -eq "-90"){
    $rotatedImage.RotateFlip([System.Drawing.RotateFlipType]::Rotate90FlipNone)
    $flip = 90
  }elseif($rotate -eq "-180"){
    $rotatedImage.RotateFlip([System.Drawing.RotateFlipType]::Rotate180FlipNone)
    $flip = 180
  }elseif($rotate -eq "-270"){
    $rotatedImage.RotateFlip([System.Drawing.RotateFlipType]::Rotate270FlipNone)
    $flip = 270
  }else{
    # 上記いずれでもなければ時計回りに90度回転
    $rotatedImage.RotateFlip([System.Drawing.RotateFlipType]::Rotate90FlipNone)
    $flip = 90
  }

  # 新ファイルネーム
  $newFileName = GetNewFileName $originalFileName $flip

  # 保存
  $rotatedImage.Save($newFileName,[System.Drawing.Imaging.ImageFormat]::Jpeg)
  
  echo "保存完了しました:$newFileName"
}

# 回転処理の実行
Main $args[0] $args[1]