Общая ошибка возникает в GDI + в Bitmap.Save () после использования SaveFileDialog - PullRequest
26 голосов
/ 28 апреля 2011

Я использую следующий блок кода с дополнительным кодом внутри блока using:

using (System.Drawing.Bitmap tempImg =
       (System.Drawing.Bitmap)tempObj.GetData(System.Windows.Forms.DataFormats.Bitmap))
{
    // ...
    tempImg.Save("..\\..\\testdata\\tempImg.bmp", ImageFormat.Bmp);                            
    // ...
}

Но я все еще получаю ошибку:

Произошла общая ошибка при GDI +

только после того, как я выполню какое-либо действие, которое не связано с кодом внутри блока using. В других случаях это работает хорошо. Также tempImg.bmp является временным файлом, поэтому я удаляю tempImg.bmp внутри самого блока using.

Так как tempImg находится внутри использования, и он расположен, я думаю, что проблема блокировки должна быть решена.

Может кто-нибудь сообщить мне, в чем заключается ошибка в этом коде?

Edit: System.Drawing.Image до System.Drawing.Bitmap как тип tempImg.

Edit: Я обнаружил, что получаю эту ошибку только после создания SaveFileDialog и нажатия пользователем кнопки «Сохранить».

Ответы [ 12 ]

40 голосов
/ 05 мая 2011

Наконец-то я смог найти, что не так в моем коде, и хотел бы упомянуть об этом здесь, так как думаю, что это может быть кому-то полезно ...

Поскольку я указал относительный путь в tempImg.Save и после того, как пользователь нажал «Сохранить» в SaveFileDialog, фактический путь для tempImg.Save стал:

Путь, указанный в SaveFileDialog + относительный путь

автоматически.

Таким образом, если путь не существует, возникает эта ошибка.

Спасибо всем за ответы.

20 голосов
/ 28 апреля 2011

У меня тоже однажды была эта проблема - это происходит потому, что растровое изображение блокируется, и вы не можете сохранить его (если хотите, я могу найти точное объяснение), так что в любом случае это можно исправить следующим образом: Создайте новое растровое изображение размером с исходное растровое изображение, которое у вас есть - скопируйте исходное растровое изображение в новое созданное растровое изображение, а затем утилизируйте исходное растровое изображение и сохраните новое.

Bitmap bm3 = new Bitmap(bm2);

А потом сохранить.

5 голосов
/ 28 апреля 2011

Обычно это показатель того, что что-то еще, возможно, какой-то другой поток в вашем собственном приложении, уже имеет целевой файл, который вы пытаетесь сохранить, заблокированный на уровне файловой системы.Если вы посмотрите на внутреннее исключение, я считаю, что следует упомянуть об этом.Если он не находится непосредственно в InnerException. Другой способ подтвердить это (или узнать, что это может быть на самом деле вместо этого) - включить исключения первого шанса в отладчике и посмотреть, какое исключение выдается «под» Сохранить, а затем превращается в этообщее исключение.

4 голосов
/ 15 августа 2012

Перепробовал все приведенные здесь решения, но тщетно. В конце концов нашел решение.

  1. Удалите любую графику, нанесенную на изображение: g.dispose();
  2. Убедитесь, что путь сохранения существует: System.IO.Directory.Exists(dir);
1 голос
/ 19 августа 2016

В моем случае это было приложение ASP.NET, в котором я заменил одну DLL, и мне пришлось просто перезапустить пул приложений после развертывания. Тогда все работало нормально.

1 голос
/ 17 апреля 2015

Обобщенная ошибка возникает в GDI + в Bitmap. Обычно сохраняется (), когда папка защищена или имя файла неверно.

Распространенная ошибка - забыть указать имя и написать только имя папки.

1 голос
/ 28 апреля 2011

Это приложение ASP.NET?

Произошла общая ошибка в GDI + в asp.net в основном из-за отсутствия разрешений для целевой папки / доступа.

Также ваш код может быть упрощен до:

       using (Image image= dataObject.GetImage())
       {
            if (image != null)
            {
                image.Save("test.bmp");
            }
        }
0 голосов
/ 27 июня 2017

Я столкнулся с той же проблемой, изменив тип изображения ".bmp" на ".png", чтобы он работал со мной

0 голосов
/ 21 января 2017

В моем случае я сохранял файл растрового изображения в том же месте, что и источник, Вот в чем проблема. Я сохраняю растровое изображение на новом месте, и теперь все в порядке.

0 голосов
/ 19 мая 2015

Удалите ваш bitMap объект после сохранения изображения:

 bitMap.Dispose()
 oimg.Dispose()

 bitMap = Nothing
 oimg = Nothing
...