管理人Kのひとりごと

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

画像回転スクリプトを大幅変更してみた。

画像回転スクリプトを大幅変更してみた。
Powershellっぽいコマンドライン引数の取り方や、例外処理、あと、個人的にほしかった元画像に対する回転処理など。
次は画像縮小スクリプトかな。

param(
[switch]$right,
[switch]$left,
[switch]$reverse,
[string]$filename,
[string]$overwrite="n"
)

$private:flip =0
if($right){
    $flip = 90
}elseif($reverse){
    $flip = 180
}elseif($left){
    $flip = 270
}else{
    $flip = 90
}

$ErrorActionPreference = "stop"
[void][System.Reflection.Assembly]::LoadWithPartialName("System.Drawing")
[void][System.Reflection.Assembly]::LoadWithPartialName("System.IO")

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

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

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

# 画像回転処理
# 引数1 :Imageオブジェクト
# 引数2 :回転角度(90,180,270)
# 戻り値:なし
function script:RotateImage($image, $rotate){

  # 回転(時計回りで90,180,270と回転)
  if($rotate -eq 90){
    $image.RotateFlip([System.Drawing.RotateFlipType]::Rotate90FlipNone)
  }elseif($rotate -eq 180){
    $image.RotateFlip([System.Drawing.RotateFlipType]::Rotate180FlipNone)
  }elseif($rotate -eq 270){
    $image.RotateFlip([System.Drawing.RotateFlipType]::Rotate270FlipNone)
  }else{
    # 上記いずれでもなければ時計回りに90度回転
    $image.RotateFlip([System.Drawing.RotateFlipType]::Rotate90FlipNone)
  }
}

# メイン処理
# 引数1 :回転角度(時計回りに 90,180,270)
# 引数2 :元画像ファイルのフルパス
# 引数3 :上書き(y) or コピー保存(n)
# 戻り値:なし
function script:Main($rotate,$originalFileName,$overwrite){
  $private:sourceImage = $null
  $private:rotatedImage = $null

  try{
      # 元画像取得
      $sourceImage = [System.Drawing.Image]::FromFile($originalFileName);

      if($overwrite -eq "n"){
        # 元画像の複製作成(回転対象はこちらの画像)
        $rotatedImage = [System.Drawing.Image]$sourceImage.Clone();

        RotateImage $rotatedImage $rotate

        # 新ファイルネーム
        $private:newFileName = GetNewFileName $originalFileName $rotate

        # 保存
        $rotatedImage.Save($newFileName,[System.Drawing.Imaging.ImageFormat]::Jpeg)

        echo "保存完了しました:$newFileName"
      }else{
        RotateImage $sourceImage $rotate

        # 保存
        $sourceImage.Save($originalFileName,[System.Drawing.Imaging.ImageFormat]::Jpeg)

        echo "保存完了しました:$originalFileName"
      }

  }catch{
    echo "例外が発生しました:$error"
  }finally{
    try{
      # 後始末
      if($null -ne $rotatedImage){
        $rotatedImage.Dispose()
      }
      if($null -ne $sourceImage){
        $sourceImage.Dispose()
      }
    }catch{
      echo "画像クローズ時の例外:$error"
    }
  }
}

# 回転処理の実行
Main $flip $filename $overwrite