У меня проблема со следующим кодом, который я пытаюсь запустить. По сути, у меня есть один исходный PNG, который я хочу скопировать во все другие найденные PNG в моем текущем каталоге, но с разрешением исходного PNG:
# Source image to replace all found images with
$sourcePng = [System.Drawing.Image]::FromFile( 'C:\Path\To\image.png' )
# Get all .png files in the directory
Get-ChildItem *.png -Recurse | Foreach-Object {
Write-Host "Converting $_ to image.png..."
$png = New-Object System.Drawing.Bitmap( $_.ToString() )
# Make sure the target size matches the existing image
$newSize = New-Object System.Drawing.Size( $png.Width, $png.Height )
# Dispose to ensure file handles are closed
$png.Dispose()
# Create new bitmap object from source png with old image resolution and save
$newPng = New-Object System.Drawing.Bitmap( $sourcePng, $newSize )
$newPng.Save( $_.ToString(), [System.Drawing.Imaging.ImageFormat]::Png ) # Errors out here
}
Однако это приводит к следующей ошибке:
Foreach-Object: исключение, вызывающее «Сохранить» с аргументом (ами) «2»: «Произошла общая ошибка c в GDI +».
В строке: 1 символ: 55
+ Get-ChildItem * .png -Recurse | Foreach-Object {
+ ~~~~~~~~~
+ CategoryInfo: NotSpecified: (:) [ForEach-Object], MethodInvocationException
+ FullyQualifiedErrorId: ExternalException, Microsoft.PowerShell.Commands.ForEachObjectCommand
My Первоначальное исследование говорит мне, что это происходит, потому что целевой файл имеет открытый дескриптор, но вызов функции Dispose
не кажется, чтобы открыть его снова. Я проверил, и я не вижу других дескрипторов файла.