PowerShellでPNG画像をJPEGに変換する際のエラーについて
Q&A
Closed
解決したいこと
PowerShellでPNG画像をJPEGに変換するコードを書いています。
そして、PowerShellのファイルのショートカットを作成しています。
ショートカットのリンク先の文字列
"Windows Powershellのパス" -ExecutionPolicy Bypass -File "PowerShellファイルのフルパス"
PNG画像と同じ階層に拡張子が「JPEG」ですが、名前は同じファイルを作成します。
しかし、エラーが出てしまいます。
正確には、複数のPNG画像がある場合、(おそらく)一番最初に処理をされている画像にエラーが発生しています。
2番目以降のPNG画像は正しく処理され画像も見ることができます。(1番目に処理されたPNG画像は、JPEGファイルとして作成はされていますが、破損しており中身を見ることはできません)
生成AIに聞いた解決策を実行してみても解決されません。
どのような原因なのでしょうか。
よろしくお願いいたします。
発生している問題・エラー
"2" 個の引数を指定して "Save" を呼び出し中に例外が発生しました: "GDI+ で汎用エラーが発生しました。"
該当するソースコード
Add-Type -AssemblyName System.Drawing
Write-Host 'PNGファイルをJPEGに変換するスクリプトです'
# フォルダパスを入力させる(存在確認あり)
while ($true) {
$folderPath = Read-Host 'フォルダのパスを入力してください'
if ([string]::IsNullOrWhiteSpace($folderPath)) {continue}
if (Test-Path -Path $folderPath -PathType Container) {
break
} else {
Write-Host 'そのフォルダは存在しません。もう一度入力してください。' -ForegroundColor Yellow
}
}
$beforeFormat = 'png'
$afterFormat = 'jpeg'
# 画像の変換処理
Get-ChildItem -Path $folderPath -File -Filter "*.${beforeFormat}" | Sort-Object Name | ForEach-Object {
try {
$img = [System.Drawing.Image]::FromFile($_.FullName)
$imageFormat = [System.Drawing.Imaging.ImageFormat]::$afterFormat
$newFileName = Join-Path -Path $_.Directory -ChildPath ($_.BaseName + ".${afterFormat}")
# 上書き保存(事前削除なし)
$img.Save($newFileName, $imageFormat)
$img.Dispose()
Write-Host "変換されたJPEGファイル:$($_.Name)" -ForegroundColor Cyan
}
catch {
Write-Host "変換失敗:$($_.Name) → $($_.Exception.Message)" -ForegroundColor Red
}
}
# ==============================
# キー入力待機(これが重要)
# ==============================
Write-Host "`n処理が完了しました。何かキーを押すと終了します..." -ForegroundColor Green
[void][System.Console]::ReadKey($true)
exit
追記
ほかにも確認してみたところ、特定のPNG画像のみにエラーが出ます。
名前の変更や問題PNG画像の複製でも変わらずエラーが出ます。
問題PNG画像を取り除いたらエラーが出ずに処理が完了しました。
その問題PNG画像は中身を確認することができます。