Общая ошибка произошла в GDI +
Я загрузил изображение в Picture Box, используя:
picturebox1.Image = Image.FromFile()
и я сохраняю его, используя:
Bitmap bm = new Bitmap(pictureBox1.Image);
bm.Save(FileName, ImageFormat.Bmp);
Он отлично работает при создании нового файла, но когда я пытаюсь заменить существующее изображение, я получаю следующую ошибку времени выполнения:
Общая ошибка произошла в GDI +
Итак, что я могу сделать, чтобы решить эту проблему?
Ответы
Ответ 1
Что, поскольку файл изображения используется вашим 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.
Ответ 2
Метод FromFile
блокирует файл, поэтому для чтения изображения используйте метод Image.FromStream():
byte[] bytes = System.IO.File.ReadAllBytes(filename);
System.IO.MemoryStream ms = new System.IO.MemoryStream(bytes);
pictureBox1.Image = Image.FromStream(ms);
Затем сохраните, как раньше.
Ответ 3
Это также может произойти, если путь не существует.
Вы можете создать директорию с помощью:
System.IO.Directory.CreateDirectory(System.IO.Path.GetDirectoryName(FileName));
Ответ 4
Если либо объект 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
EDIT: Просто запись из памяти. Сохранение "посреднику" 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);
}
}
Ответ 5
попробуйте это.
picturebox1.Image = Image.FromFile(FileName);
Bitmap bm = new Bitmat(pictureBox1.Image);
Image img = (Image)b;
img.Save(FileName, ImageFormat.Bmp);
Ответ 6
Так же, как @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?
Ответ 7
попробуйте это, он будет работать
public void SavePicture()
{
Bitmap bm = new Bitmap(this.myBitmap)
bm.Save("Output\\out.bmp" ,System.Drawing.Imaging.ImageFormat.Bmp );
}
Ответ 8
Это также может произойти, если вы забыли добавить имя файла:
bm.Save(@"C:\Temp\Download", System.Drawing.Imaging.ImageFormat.Png);
И может быть исправлено добавлением имени файла:
bm.Save(@"C:\Temp\Download\Image.png", System.Drawing.Imaging.ImageFormat.Png);
Примечание. Фактически вам не нужно добавлять расширение для его работы.
Ответ 9
Попробуйте следующее:
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;
}
}
}
Ответ 10
В GDI+ произошла общая ошибка
Я также столкнулся с той же проблемой. Я пробовал так много способов, чтобы исправить эту проблему. Наконец, я нашел место, где я ошибся. Проблема в том, что я использовал пространство в пути к файлу, что недопустимо. Теперь он работает нормально после удаления пробела перед C после апострофа:
"SupplyItems":"C:\\inetpub\\HIBMS_Ver1\\BarcodeImages\\Supply\\"
вместо этого... я использовал ниже одного.
"SupplyItems":" C:\\inetpub\\HIBMS_Ver1\\BarcodeImages\\Supply\\"
Незначительная ошибка, но потребовалось много времени, чтобы найти и исправить ее.
Ответ 11
Обратите внимание, что изображения, созданные с помощью Image.Clone(), по-прежнему будут вызывать ошибки GDI+, как показано в приведенном ниже коде BAD, вы должны использовать метод Image.FromStream() для чтения изображения, как показано в решении на этой странице.
//BAD CODE: the image we will try to save AFTER the original image has been cloned and disposed
Image clonedImage;
//load image from file, clone it then dispose
using (var loadedFromDiskImage = Image.FromFile(filePath))
{
clonedImage = (Image) loadedFromDiskImage.Clone();
}
//you might think the new image can be saved given the original is disposed
//but this does not seem to be the way Clone() works
//expect GDI+ error in line below:
clonedImage.Save(filePath);