おれさまラボ

実際に手を動かして理解を深めるブログ。

PowerShell:右クリックで画像をサクッと縮小する

はじめに

画像を縮小したいときってあるけど、縮小専用みたいなソフトウェアを入れるほどでもないってときに、PowerShellでどうにかできないかなと思ったので試してみた記録です。

どう実現するか

Windows環境でとりあえず使えれば良いが、移行が楽なほうが良いのでなるべく追加ツールを使わない方向性としました。そうなってくるとやっぱり便利なのはPowerShellです。

実装

PowerShellスクリプト

以下のようにスクリプトを書きました。サイズを変更する可能性があるので、引数からサイズを取得する設計としました。

param(
    [Parameter(Mandatory=$false)]
    [int]$newWidth = 0,

    [Parameter(Mandatory=$false)]
    [int]$newHeight = 0,

    [Parameter(Mandatory=$true, ValueFromRemainingArguments=$true)]
    [string[]]$Path
)

# System.Drawingのインポートを行う
Add-Type -AssemblyName System.Drawing

# ファイルパスを順次処理する
foreach ($p in $Path) {
    try {
        # 画像を読み込む
        $image = [System.Drawing.Image]::FromFile($p)

        # 縦横比を計算
        $ratio = $image.Height / $image.Width

        # newWidth または newHeight のみが指定されている場合、縦横比を維持してもう一方を計算
        if ($newWidth -gt 0 -and $newHeight -eq 0) {
            $newHeight = [int]($newWidth * $ratio)
        } elseif ($newHeight -gt 0 -and $newWidth -eq 0) {
            $newWidth = [int]($newHeight / $ratio)
        }

        # 新しいビットマップイメージを作成
        $resized = New-Object System.Drawing.Bitmap $newWidth, $newHeight

        # グラフィックオブジェクトを作成
        $graphic = [System.Drawing.Graphics]::FromImage($resized)

        # 画像の品質を設定
        $graphic.InterpolationMode = [System.Drawing.Drawing2D.InterpolationMode]::HighQualityBicubic

        # 画像をリサイズして新しいビットマップに描画
        $graphic.DrawImage($image, 0, 0, $newWidth, $newHeight)

        # リサイズ後のファイル名を生成
        $directory = [System.IO.Path]::GetDirectoryName($p)
        $filename = [System.IO.Path]::GetFileNameWithoutExtension($p)
        $extension = [System.IO.Path]::GetExtension($p)
        $newPath = [System.IO.Path]::Combine($directory, $filename + "_resized" + $extension)

        # リサイズした画像を新しいファイル名で保存
        $resized.Save($newPath, [System.Drawing.Imaging.ImageFormat]::Jpeg)
    } catch {
        Write-Error "エラーが発生しました: $_"
    } finally {
        # オブジェクトを解放
        if ($image -ne $null) {
            $image.Dispose()
        }
        if ($resized -ne $null) {
            $resized.Dispose()
        }
        if ($graphic -ne $null) {
            $graphic.Dispose()
        }
    }
}

右クリックメニューに追加

いちいちPowerShellスクリプトを実行するのも難儀なので、右クリックメニューから使えるようにします。ただ、レジストリをいじるのも面倒なので、今回は「送る」メニューから使えるように整えます。

1.Windows + R (ファイル名を指定して実行)で shell:sendto を入力し、SendTo フォルダを開く。

2.右クリックメニューから新規作成>ショートカットをクリックする。

3.ショートカットの作成ウィンドウが起動したことを確認する。

4.「項目の場所を入力してください」に以下を入力する。newWidthのところでサイズを指定します。高さを指定したい場合はnewHightでOKです。

powershell -WindowStyle Hidden -File "作成したPowerShellスクリプトのフルパス" -newWidth 240 -Path 

5.「ショートカットの名前を付けてください」に任意の名前を入れる。今回は「画像を縮小する (240サイズ)」としました。

6.[完了] をクリックし、ショートカットの作成ウィンドウを閉じる。

スクリプトのパスが変更になった等、ショートカットの内容を修正したい場合は、作成したショートカットの右クリックメニュー>プロパティからリンク先を変更してください。

動作確認

1.縮小したい画像を任意のフォルダに配置します。1つでも複数でも構いません。

2.右クリックメニュー>送る に配置したショートカットメニューが表示されていることを確認し、クリックします。

3.スクリプトが実行されれば、画像ファイルと同じフォルダ内に_resizedとファイル名に付与されたファイルが完成しているはずです。

4._resizedとファイル名に付与されたファイルを開いて、縮小されていることを確認します。

おわりに

Windowsの右クリックメニューを使って、画像の縮小を簡単に行う方法でした。今回のように固定サイズであれば、専用のソフトウェア等を使用するより右クリックメニューからサクッとできちゃうほうが楽ちんですね。

ちなみに、Mac OSの場合だとメニューバーからショートカットを使うのが楽かなと思います。

役に立ったなという方はビール1杯奢ってください。

この続きはcodocで購入