Подтвердить что ты не робот

Общая ошибка возникает при GDI + в Bitmap.Save() после использования SaveFileDialog

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

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

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

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

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

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

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

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

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

4b9b3361

Ответ 1

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

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

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

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

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

Спасибо каждому за ответы.

Ответ 2

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

Bitmap bm3 = new Bitmap(bm2);

И затем сохраните.

Ответ 3

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

Ответ 4

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

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

Ответ 5

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

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

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

       using (Image image= dataObject.GetImage())
       {
            if (image != null)
            {
                image.Save("test.bmp");
            }
        }

Ответ 6

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

Ответ 7

Это образец кода из форумов Microsoft.

// new image with transparent Alpha layer
using (var bitmap = new Bitmap(330, 18, PixelFormat.Format32bppArgb))
{
    using (var graphics = Graphics.FromImage(bitmap))
    {
        // add some anti-aliasing
        graphics.SmoothingMode = SmoothingMode.AntiAlias;

        using (var font = new Font("Arial", 14.0f, GraphicsUnit.Pixel))
        {
            using (var brush = new SolidBrush(Color.White))
            {
                // draw it
                graphics.DrawString(user.Email, font, brush, 0, 0);
            }
        }
    }

    // setup the response
    Response.Clear();
    Response.ContentType = "image/png";
    Response.BufferOutput = true;

    // write it to the output stream
    bitmap.Save(Response.OutputStream, ImageFormat.Png);
    Response.Flush();
}

Ответ 8

Я пытаюсь сохранить изображение с ресурса, и это дает мне слишком ошибку GDI, когда я напрямую использую метод Bitmap.Save(путь к файлу). Я думаю, мы можем использовать тот же код ниже для любого другого растрового изображения, клонируя его.

Private void SaveResourceImage() {
    object resBmpObject = Resource.Image1.Clone();//Bitmap Image from resource file
    //object resBmpObject = anyBmpImage.clone(); //for image other than resource image
    Bitmap resBmpImage = (Bitmap)resBmpObject;
    resBmpImage.Save(destFilePath, System.Drawing.Imaging.ImageFormat.Png);
    resBmpImage.dispose();
}

Ответ 9

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

Общей ошибкой является забыть создать имя и просто написать имя папки.

Ответ 10

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

 bitMap.Dispose()
 oimg.Dispose()

 bitMap = Nothing
 oimg = Nothing

Ответ 11

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

Ответ 12

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