大きすぎる画像をあるサイズ以下まで縮小したい、ということがしばしばある。
作業の頻度が少ないうちはペイントでやったりオンラインで圧縮できるサイト等を使ったりしていたが、頻度が多くなってきたためGPT-4君にPowerShellで組んでもらうことにした。
以下はそのコードに少し手直したもの。
ImageResizing.ps1
# ===設定値===
$scalingFactor = 0.5 #画像縮小率
$inputDir = "C:\Input" #入力元フォルダ
$outputDir = "C:\Output" #出力元フォルダ
$usePngFormat = $false #出力形式(TrueでPNG、FalseでJPEG)
# ===コード===
# 指定フォルダ内の全てのPNGファイルを取得
$imageFiles = Get-ChildItem -Path $inputDir -Filter *.png
# 取得した画像を一枚づつ処理
foreach($imageFile in $imageFiles) {
# 元画像の読み込み
$image = [System.Drawing.Image]::FromFile($imageFile.FullName)
# 新しいサイズを計算
$newWidth = [int]($image.Width * $scalingFactor)
$newHeight = [int]($image.Height * $scalingFactor)
# 新しいサイズでビットマップオブジェクトを生成
$newImage = New-Object System.Drawing.Bitmap $newWidth, $newHeight
$graphics = [System.Drawing.Graphics]::FromImage($newImage)
# 描画品質を設定
$graphics.CompositingQuality = [System.Drawing.Drawing2D.CompositingQuality]::HighQuality
$graphics.InterpolationMode = [System.Drawing.Drawing2D.InterpolationMode]::HighQualityBicubic
$graphics.SmoothingMode = [System.Drawing.Drawing2D.SmoothingMode]::HighQuality
# 画像の描画
$graphics.DrawImage($image, 0, 0, $newWidth, $newHeight)
# PNGまたはJPEGで画像を保存
if($usePngFormat){
$outputFile = Join-Path $outputDir "$($imageFile.BaseName).png"
$newImage.Save($outputFile, [System.Drawing.Imaging.ImageFormat]::Png)
}Else{
$outputFile = Join-Path $outputDir "$($imageFile.BaseName).jpg"
$newImage.Save($outputFile, [System.Drawing.Imaging.ImageFormat]::Jpeg)
}
# リソースの解放
$graphics.Dispose()
$newImage.Dispose()
$image.Dispose()
# 処理状況の表示
Write-Host "Pocessed: $($imageFile.FullName) -> $outputFile"
}
エラーハンドリングは入れていないが、個人で使う分には十分使えている。
なお、筆者の場合はPNG指定にしているが、JPEG等も読み込ませたい場合は指定フォルダ内からの取得処理を以下のように書き換えることで対応できる。
PNG以外も読み込みたい場合
$imageFiles = Get-ChildItem -Path $inputDir -Include *.png, *.jpg -File