c# - ejemplo - Se produjo un error genérico en GDI+
image c# (8)
Cargué una imagen en un cuadro de imagen usando:
picturebox1.Image = Image.FromFile()
y lo guardo usando:
Bitmap bm = new Bitmap(pictureBox1.Image);
bm.Save(FileName, ImageFormat.Bmp);
Funciona perfectamente bien al crear un nuevo archivo, pero cuando trato de reemplazar la imagen existente, me arrojan el siguiente error de tiempo de ejecución:
Se produjo un error genérico en GDI +
Entonces, ¿qué puedo hacer para resolver este problema?
prueba esto.
picturebox1.Image = Image.FromFile(FileName);
Bitmap bm = new Bitmat(pictureBox1.Image);
Image img = (Image)b;
img.Save(FileName, ImageFormat.Bmp);
Esto también puede suceder si la ruta no existe.
Puedes crear el directorio con:
System.IO.Directory.CreateDirectory(System.IO.Path.GetDirectoryName(FileName));
Eso porque el archivo de imagen lo usa picturebox1.Image
, intente guardarlo en una ruta de archivo diferente en su lugar:
picturebox1.Image = Image.FromFile(FileName);
Bitmap bm = new Bitmap(pictureBox1.Image);
bm.Save(@"New File Name", ImageFormat.Bmp);
Editar: también podría agregar una copia de la imagen en primer lugar como:
picturebox1.Image = new Bitmap(Image.FromFile(FileName));
Bitmap bm = new Bitmap(pictureBox1.Image);
bm.Save(FileName, ImageFormat.Bmp);//no error will occurs here.
El método FromFile
bloquea el archivo, por lo tanto, use el método Image.FromStream () para leer la imagen:
byte[] bytes = System.IO.File.ReadAllBytes(filename);
System.IO.MemoryStream ms = new System.IO.MemoryStream(bytes);
pictureBox1.Image = Image.FromStream(ms);
Luego guarda como lo hacías antes.
Al igual que @Jalal Aldeen Saa''d dijo, el cuadro de imagen está usando el archivo y bloqueado desde el reemplazo del archivo.
//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?
intenta esto, funcionará
public void SavePicture()
{
Bitmap bm = new Bitmap(this.myBitmap)
bm.Save("Output//out.bmp" ,System.Drawing.Imaging.ImageFormat.Bmp );
}
Esto también puede suceder si olvida agregar el nombre de archivo:
bm.Save(@"C:/Temp/Download", System.Drawing.Imaging.ImageFormat.Png);
Y se puede arreglar agregando el nombre del archivo:
bm.Save(@"C:/Temp/Download/Image.png", System.Drawing.Imaging.ImageFormat.Png);
Nota: en realidad no tiene que agregar la extensión para que funcione.
Cuando un objeto Bitmap o un objeto Image se construye a partir de un archivo, el archivo permanece bloqueado durante el tiempo de vida del objeto. Como resultado, no puede cambiar una imagen y guardarla nuevamente en el mismo archivo donde se originó. http://support.microsoft.com/?id=814675
Se produjo un error genérico en GDI +, JPEG Image to 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
EDITAR: solo escribiendo desde la memoria. Guardar en un intermediario MemoryStream
debería funcionar:
Por ejemplo, reemplace esto:
Bitmap newBitmap = new Bitmap(thumbBMP);
thumbBMP.Dispose();
thumbBMP = null;
newBitmap.Save("~/image/thumbs/" + "t" + objPropBannerImage.ImageId, ImageFormat.Jpeg);
con algo como:
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);
}
}