Обобщенная c ошибка произошла в GDI + при вызове Bitmap.Save () - PullRequest
0 голосов
/ 23 апреля 2020

У меня проблема со следующим кодом, который я пытаюсь запустить. По сути, у меня есть один исходный 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 не кажется, чтобы открыть его снова. Я проверил, и я не вижу других дескрипторов файла.

1 Ответ

0 голосов
/ 23 апреля 2020

Я выяснил решение после того, как написал это, когда попробовал еще пару вещей, и подумал, что это может избавить кого-то еще от головной боли. Оказывается, поскольку мой исходный код никогда не удалял объект $png, изображение все еще было «заблокировано», что касается GDI +. Я закрыл сеанс PowerShell, открыл новый и повторно запустил код, а изображения были записаны, как и ожидалось.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...