PowerShell で画像の回転、リサイズを行う

経緯

スマホで取った写真の解像度が大きいので、SNS へのアップ前に自力で小さくしようと思ったら GIMP 立ち上げて… 面倒だったので、PowerShell でやってみました

画像の回転

# アセンブリの読み込み
[void][Reflection.Assembly]::LoadWithPartialName("System.Drawing")

# 画像ファイルの読み込み
$image = New-Object System.Drawing.Bitmap("ファイルパス")

# 回転
$image.RotateFlip("RotateFlipType 列挙体より選択") 

# 保存
$image.Save("ファイルパス", [System.Drawing.Imaging.ImageFormat]::"ImageFormat クラスのプロパティより選択")

# オブジェクトの破棄
$image.Dispose()

RotateFlipType 列挙体と意味

反転 回転(全て時計回り)
Rotate270FlipNone なし 270 度
Rotate180FlipNone なし 180 度
Rotate90FlipNone なし 90 度
RotateNoneFlipNone なし なし
Rotate270FlipX 水平 270 度
Rotate180FlipX 水平 180 度
Rotate90FlipX 水平 90 度
RotateNoneFlipX 水平 なし
Rotate270FlipY 垂直 270 度
Rotate180FlipY 垂直 180 度
Rotate90FlipY 垂直 90 度
RotateNoneFlipY 垂直 なし
Rotate270FlipXY 水平&垂直 270 度
Rotate180FlipXY 水平&垂直 180 度
Rotate90FlipXY 水平&垂直 90 度
RotateNoneFlipXY 水平&垂直 なし

回転の例

デスクトップの hoge.jpg を時計回りに 90 度回転させて hoge_turn90.jpg として保存する例

# アセンブリの読み込み
[void][Reflection.Assembly]::LoadWithPartialName("System.Drawing")

# 画像ファイルの読み込み
$image = New-Object System.Drawing.Bitmap("C:\Users\miyamiya\Desktop\hoge.jpg")

# 回転
$image.RotateFlip("Rotate90FlipNone") 

# 保存
$image.Save("C:\Users\miyamiya\Desktop\hoge_turn90.jpg", [System.Drawing.Imaging.ImageFormat]::Jpeg)

# オブジェクトの破棄
$image.Dispose()

画像のリサイズ

# アセンブリの読み込み
[void][Reflection.Assembly]::LoadWithPartialName("System.Drawing")

# 画像ファイルの読み込み
$image = New-Object System.Drawing.Bitmap("ファイルパス")

# 縮小先のオブジェクトを生成
$canvas = New-Object System.Drawing.Bitmap("リサイズ後の幅", "リサイズ後の高さ")

# 縮小先へ描画
$graphics = [System.Drawing.Graphics]::FromImage($canvas)
$graphics.DrawImage($image, (New-Object System.Drawing.Rectangle(0, 0, $canvas.Width, $canvas.Height)))

# 保存
$canvas.Save("ファイルパス", [System.Drawing.Imaging.ImageFormat]::"ImageFormat クラスのプロパティより選択")

# オブジェクトの破棄
$graphics.Dispose()
$canvas.Dispose()
$image.Dispose()

縮小の例

デスクトップの hoge.jpg を 幅と高さを 50% にして hoge_resize.jpg として保存する例

# アセンブリの読み込み
[void][Reflection.Assembly]::LoadWithPartialName("System.Drawing")

# 画像ファイルの読み込み
$image = New-Object System.Drawing.Bitmap("C:\Users\miyamiya\Desktop\hoge.jpg")

# 縮小先のオブジェクトを生成
$canvas = New-Object System.Drawing.Bitmap([int]($image.Width / 2), [int]($image.Height / 2))

# 縮小先へ描画
$graphics = [System.Drawing.Graphics]::FromImage($canvas)
$graphics.DrawImage($image, (New-Object System.Drawing.Rectangle(0, 0, $canvas.Width, $canvas.Height)))

# 保存
$canvas.Save("C:\Users\miyamiya\Desktop\hoge_resize.jpg", [System.Drawing.Imaging.ImageFormat]::Jpeg)

# オブジェクトの破棄
$graphics.Dispose()
$canvas.Dispose()
$image.Dispose()

参考