ExternalException при сохранении .bmp в MemoryStream как .png - PullRequest
0 голосов
/ 30 июня 2018

Я конвертирую партию .bmp в .png. Это соответствующая часть кода:

foreach (string path in files) {
    using (fs = new FileStream(path, FileMode.Open)) bmp = new Bitmap(fs);

    using (ms = new MemoryStream()) {
        bmp.Save(ms, ImageFormat.Png);
        bmp.Dispose();

        png = Image.FromStream(ms);
    }

    png.Save(path);
}

В строке bmp.Save(ms, ImageFormat.Png); выдается следующее исключение:

System.Runtime.InteropServices.ExternalException: «Произошла общая ошибка в GDI +.»

Согласно MSDN это означает, что изображение было сохранено в неправильном формате или в том же месте, откуда оно было прочитано. Последнее не так. Однако я не понимаю, как я указал неправильный формат: на той же странице MSDN приведен пример, в котором .bmp преобразуется в .gif таким же образом.

Это связано со мной при сохранении в MemoryStream? Это сделано для того, чтобы я мог перезаписать исходный файл преобразованным. (Обратите внимание, что суффикс .bmp хранится намеренно. Это не должно быть проблемой, поскольку исключение появляется до сохранения окончательного файла.)

1 Ответ

0 голосов
/ 30 июня 2018

В документации MSDN этого конструктора растрового изображения говорится:

Вы должны держать поток открытым в течение всего времени жизни растрового изображения.

и то же самое замечание можно найти на Image.FromStream.

Таким образом, ваш код должен тщательно обрабатывать область и время жизни потоков, которые он использует для каждого из этих растровых изображений / изображений.

Объединяя все, что следующий код правильно обрабатывает эти потоки:

foreach (string path in files) {
   using (var ms = new MemoryStream()) //keep stream around
   {
        using (var fs = new FileStream(path, FileMode.Open)) // keep file around
        {
            // create and save bitmap to memorystream
            using(var bmp = new Bitmap(fs))
            {
                bmp.Save(ms, System.Drawing.Imaging.ImageFormat.Png);
            }
        }
        // write the PNG back to the same file from the memorystream
        using(var png = Image.FromStream(ms))
        {
            png.Save(path);
        }
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...