В GDI + произошла общая ошибка - PullRequest
19 голосов
/ 18 августа 2011

Я загрузил изображение в Picture Box, используя:

picturebox1.Image = Image.FromFile()

и я сохраняю его, используя:

Bitmap bm = new Bitmap(pictureBox1.Image);
bm.Save(FileName, ImageFormat.Bmp);

Отлично работает при создании нового файла, но при попытке заменить существующий образ выдается следующее сообщение об ошибке во время выполнения:

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

Так что я могу сделать, чтобы решить эту проблему ??

Ответы [ 9 ]

15 голосов
/ 18 августа 2011

Это потому, что файл изображения используется вашим picturebox1.Image, попробуйте сохранить его по другому пути:

picturebox1.Image = Image.FromFile(FileName);
Bitmap bm = new Bitmap(pictureBox1.Image); 
bm.Save(@"New File Name", ImageFormat.Bmp);

Редактировать: Вы также можете добавить копию изображения с первого места, как:

picturebox1.Image = new Bitmap(Image.FromFile(FileName));
Bitmap bm = new Bitmap(pictureBox1.Image); 
bm.Save(FileName, ImageFormat.Bmp);//no error will occurs here.
6 голосов
/ 18 августа 2011

Метод FromFile блокирует файл, поэтому используйте метод Image.FromStream () для чтения изображения:

byte[] bytes = System.IO.File.ReadAllBytes(filename);
System.IO.MemoryStream ms = new System.IO.MemoryStream(bytes);
pictureBox1.Image = Image.FromStream(ms);

Затем сохраните, как раньше.

4 голосов
/ 30 апреля 2013

Это также может произойти, если путь не существует.

Вы можете создать каталог с помощью:

System.IO.Directory.CreateDirectory(System.IO.Path.GetDirectoryName(FileName));
1 голос
/ 10 июня 2015

Когда объект Bitmap или объект Image создается из файла, файл остается заблокированным в течение всего времени существования объекта.В результате вы не можете изменить изображение и сохранить его обратно в тот же файл, в котором оно было создано.http://support.microsoft.com/?id=814675

Произошла общая ошибка в GDI +, JPEG-изображении в MemoryStream:

Image.Save(..)  // throws a GDI+ exception because the memory stream is closed

http://alperguc.blogspot.in/2008/11/c-generic-error-occurred-in-gdi.html

РЕДАКТИРОВАТЬ: Просто запись изобъем памяти.Сохранение в «посреднике» MemoryStream должно работать:

Например, замените это:

Bitmap newBitmap = new Bitmap(thumbBMP);
thumbBMP.Dispose();
thumbBMP = null;
newBitmap.Save("~/image/thumbs/" + "t" + objPropBannerImage.ImageId, ImageFormat.Jpeg);

на что-то вроде:

string outputFileName = "...";
using (MemoryStream memory = new MemoryStream())
{
    using (FileStream fs = new FileStream(outputFileName, FileMode.Create, FileAccess.ReadWrite))
    {
        thumbBMP.Save(memory, ImageFormat.Jpeg);
        byte[] bytes = memory.ToArray();
        fs.Write(bytes, 0, bytes.Length);
    }
}
1 голос
/ 18 августа 2011

попробуйте это.

picturebox1.Image = Image.FromFile(FileName);
Bitmap bm = new Bitmat(pictureBox1.Image); 
Image img = (Image)b;
img.Save(FileName, ImageFormat.Bmp);
0 голосов
/ 03 января 2018

Попробуйте это:

private void LoadPictureBoxWithImage( string ImagePath)
{
    Stream objInputImageStream = null;
    BitmapData bmdImageData = null;
    Bitmap bmpSrcImage = null, bmTemp = null;
    byte[] arrImageBytes = null;
    int bppModifier = 3;
    try
    {

        objInputImageStream = new MemoryStream();
        using (FileStream objFile = new FileStream(ImagePath, FileMode.Open, FileAccess.Read))
        {
            objFile.CopyTo(objInputImageStream);
        }

        bmpSrcImage = new Bitmap(objInputImageStream);
        bppModifier = bmpSrcImage.PixelFormat == PixelFormat.Format24bppRgb ? 3 : 4;

        //reda from byte[] to bitmap               
        bmdImageData = bmpSrcImage.LockBits(new Rectangle(0, 0, bmpSrcImage.Width, bmpSrcImage.Height), ImageLockMode.ReadOnly, bmpSrcImage.PixelFormat);
        arrImageBytes = new byte[Math.Abs(bmdImageData.Stride) * bmpSrcImage.Height];

        System.Runtime.InteropServices.Marshal.Copy(bmdImageData.Scan0, arrImageBytes, 0, arrImageBytes.Length);
        bmpSrcImage.UnlockBits(bmdImageData);

        pbSetup.Image = (Bitmap)bmpSrcImage.Clone();
        pbSetup.Refresh();

    }
    catch (Exception ex)
    {
        throw new Exception("Error in Function " + System.Reflection.MethodInfo.GetCurrentMethod().Name + "; " + ex.Message);
    }
    finally
    {
        if (objInputImageStream != null)
        {
            objInputImageStream.Dispose();
            objInputImageStream = null;
        }
        if (bmdImageData != null)
        {
            bmdImageData = null;
        }
        if (bmpSrcImage != null)
        {
            bmpSrcImage.Dispose();
            bmpSrcImage = null;
        }
        if (bmTemp != null)
        {
            bmTemp.Dispose();
            bmTemp = null;
        }
        if (arrImageBytes != null)
        {
            arrImageBytes = null;
        }
    }

}
0 голосов
/ 13 октября 2016

Это также может произойти, если вы забыли добавить имя файла:

bm.Save(@"C:\Temp\Download", System.Drawing.Imaging.ImageFormat.Png);

И это можно исправить, добавив имя файла:

bm.Save(@"C:\Temp\Download\Image.png", System.Drawing.Imaging.ImageFormat.Png);

Примечание.необходимо добавить расширение, чтобы оно работало.

0 голосов
/ 09 сентября 2016

попробуйте это будет работать

public void SavePicture()
{
     Bitmap bm = new Bitmap(this.myBitmap)
     bm.Save("Output\\out.bmp" ,System.Drawing.Imaging.ImageFormat.Bmp );
}
0 голосов
/ 14 ноября 2015

Как сказал @Jalal Aldeen Saa'd, окно с картинками использует файл и заблокировано от замены файла.

//unlock file by clearing it from picture box
if (picturebox1.Image != null)
{
   picturebox1.Image.Dispose();
   picturebox1.Image = null;
}

//put back the picture inside the pictureBox?
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...