見出し画像

即売会のカタログ用とかの画像のサイズ調整が面倒なのでpowershellでサイズ変更するスクリプト作ってみた(ChatGPTが)

同人即売会とかに出展するときに、サークルカットとか告知用の画像を送ろうとするとファイルサイズやピクセル指定されていたりして、いちいちサイズ変更するの面倒じゃないですか?面倒ですよね?私は面倒です。

そこでpowershellで画像をリサイズするスクリプトを作ってみました。ちなみに私はプログラムとか全然わからないので、全部ChatGPTにやらせました。「作った」ではなく「作らせた」が正しいですね。ほんとに全くコードが読めないので「このコードを追加してください」とか言われてもどこに追加するのかわからないから修正の度に全部書かせました。パワハラですね。

そんなChatGPTくんの血と涙の結晶ですが、何が書いてあるかわからないので、何が起きても責任取れないので作る手順とコードだけ載せておきます。

まずはpowershell ISEを開いて以下のスクリプトをコピペして保存します。

【powershellのスクリプト】

Add-Type -AssemblyName System.Drawing
Add-Type -AssemblyName System.Windows.Forms

# コマンドライン引数から画像のパスを取得
if ($args.Count -eq 0) {
    [System.Windows.Forms.MessageBox]::Show("画像ファイルをドラッグ&ドロップしてください。")
    exit
}
$srcpath = $args[0] # ドラッグ&ドロップされた画像のパス

function Show-SizeFormatInputDialog {
    $inputDialog = New-Object System.Windows.Forms.Form
    $inputDialog.StartPosition = 'CenterScreen'
    $inputDialog.Size = New-Object System.Drawing.Size(300, 200)
    $inputDialog.Text = "サイズと形式の入力"

    # 幅の入力
    $labelWidth = New-Object System.Windows.Forms.Label
    $labelWidth.Location = New-Object System.Drawing.Point(10, 10)
    $labelWidth.Size = New-Object System.Drawing.Size(280, 20)
    $labelWidth.Text = "最大幅:"
    $inputDialog.Controls.Add($labelWidth)

    $textBoxWidth = New-Object System.Windows.Forms.TextBox
    $textBoxWidth.Location = New-Object System.Drawing.Point(10, 30)
    $textBoxWidth.Size = New-Object System.Drawing.Size(260, 20)
    $textBoxWidth.Text = "300"
    $inputDialog.Controls.Add($textBoxWidth)

    # 高さの入力
    $labelHeight = New-Object System.Windows.Forms.Label
    $labelHeight.Location = New-Object System.Drawing.Point(10, 60)
    $labelHeight.Size = New-Object System.Drawing.Size(280, 20)
    $labelHeight.Text = "最大高さ:"
    $inputDialog.Controls.Add($labelHeight)

    $textBoxHeight = New-Object System.Windows.Forms.TextBox
    $textBoxHeight.Location = New-Object System.Drawing.Point(10, 80)
    $textBoxHeight.Size = New-Object System.Drawing.Size(260, 20)
    $textBoxHeight.Text = "300"
    $inputDialog.Controls.Add($textBoxHeight)

    # 形式の選択
    $labelFormat = New-Object System.Windows.Forms.Label
    $labelFormat.Location = New-Object System.Drawing.Point(10, 110)
    $labelFormat.Size = New-Object System.Drawing.Size(280, 20)
    $labelFormat.Text = "保存形式:"
    $inputDialog.Controls.Add($labelFormat)

    $comboBoxFormat = New-Object System.Windows.Forms.ComboBox
    $comboBoxFormat.Location = New-Object System.Drawing.Point(10, 130)
    $comboBoxFormat.Size = New-Object System.Drawing.Size(260, 20)
    $comboBoxFormat.DropDownStyle = [System.Windows.Forms.ComboBoxStyle]::DropDownList
    $comboBoxFormat.Items.AddRange(@("JPEG", "PNG"))
    $comboBoxFormat.SelectedIndex = 0
    $inputDialog.Controls.Add($comboBoxFormat)

    # OKボタン
    $okButton = New-Object System.Windows.Forms.Button
    $okButton.Location = New-Object System.Drawing.Point(115, 160)
    $okButton.Size = New-Object System.Drawing.Size(75, 23)
    $okButton.Text = "OK"
    $okButton.DialogResult = [System.Windows.Forms.DialogResult]::OK
    $inputDialog.AcceptButton = $okButton
    $inputDialog.Controls.Add($okButton)

    $inputDialog.ShowDialog() > $null

    if ($inputDialog.DialogResult -eq [System.Windows.Forms.DialogResult]::OK) {
        return $textBoxWidth.Text, $textBoxHeight.Text, $comboBoxFormat.SelectedItem.ToString()
    }
    return $null
}

$sizesAndFormat = Show-SizeFormatInputDialog
if ($sizesAndFormat -ne $null) {
    $maxWidth, $maxHeight, $selectedFormat = $sizesAndFormat
} else {
    exit
}

$maxw = [int]$maxWidth
$maxh = [int]$maxHeight
$imageFormat = switch ($selectedFormat) {
    "JPEG" { [System.Drawing.Imaging.ImageFormat]::Jpeg }
    "PNG" { [System.Drawing.Imaging.ImageFormat]::Png }
}

# 画像取得・リサイズ
$srcbmp = [System.Drawing.Bitmap]::FromFile($srcpath)
$k = [Math]::Min($maxw / $srcbmp.Width, $maxh / $srcbmp.Height)
$w = [int][Math]::Round($srcbmp.Width * $k)
$h = [int][Math]::Round($srcbmp.Height * $k)
$destbmp = [System.Drawing.Bitmap]::new($w, $h)
$g = [System.Drawing.Graphics]::FromImage($destbmp)
$g.DrawImage($srcbmp, 0, 0, $w, $h)

# 保存
$extension = $selectedFormat.ToLower() # 選択された形式を小文字に変換
$destPath = $srcpath -replace "(.*)(\..*?)$", "`$1_resized.$extension" # ファイル名の設定
$destbmp.Save($destPath, $imageFormat)

# 後片付け
$g.Dispose()
$destbmp.Dispose()
$srcbmp.Dispose()

Write-Host "画像のリサイズと保存が完了しました。フォーマット: $selectedFormat"


次に画像をドラッグするだけでpowershellにファイルパスを送れるようにバッチファイルを作成します。メモ帳に以下のコードを貼り付けてbat形式で保存して、デスクトップにショートカットを作成しておきます。

【バッチファイルのスクリプト】

@echo off
chcp 65001
powershell.exe -ExecutionPolicy Bypass -File "上記のpowershellスクリプトのファイルパス" "%1
pause


あとはバッチファイルのショートカットに画像をドラッグするとダイアログが現れるので

サイズと保存形式を入力するダイアログが出てくるので、入力してEnterを押すだけ!

これでサイズ変更のためだけにwebサービス使ったりペイントを開く日々とはオサラバだ!

この記事が気に入ったらサポートをしてみませんか?