4
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

シェルスクリプト&PowerShellAdvent Calendar 2024

Day 10

【PowerShell】指定したフォルダ内の画像を縮小して別のフォルダに出力する

Posted at

大きすぎる画像をあるサイズ以下まで縮小したい、ということがしばしばある。
作業の頻度が少ないうちはペイントでやったりオンラインで圧縮できるサイト等を使ったりしていたが、頻度が多くなってきたため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
4
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
4
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?