J'ai chargé une image dans une zone d'image en utilisant:
picturebox1.Image = Image.FromFile()
et je le sauvegarde en utilisant:
Bitmap bm = new Bitmap(pictureBox1.Image);
bm.Save(FileName, ImageFormat.Bmp);
Cela fonctionne parfaitement lors de la création d'un nouveau fichier, mais lorsque j'essaie de remplacer l'image existante, l'erreur d'exécution suivante est générée:
Une erreur générique s'est produite dans GDI +
Alors, que puis-je faire pour résoudre ce problème?
Cela parce que le fichier image est utilisé par votre picturebox1.Image
, essayez plutôt de l'enregistrer dans un autre chemin:
picturebox1.Image = Image.FromFile(FileName);
Bitmap bm = new Bitmap(pictureBox1.Image);
bm.Save(@"New File Name", ImageFormat.Bmp);
Edit: Vous pouvez aussi ajouter une copie de l'image à la première place comme:
picturebox1.Image = new Bitmap(Image.FromFile(FileName));
Bitmap bm = new Bitmap(pictureBox1.Image);
bm.Save(FileName, ImageFormat.Bmp);//no error will occurs here.
La méthode FromFile
verrouille le fichier, utilisez donc la méthode Image.FromStream () pour lire l'image:
byte[] bytes = System.IO.File.ReadAllBytes(filename);
System.IO.MemoryStream ms = new System.IO.MemoryStream(bytes);
pictureBox1.Image = Image.FromStream(ms);
Puis sauvez comme vous étiez avant.
Cela peut aussi arriver si le chemin n'existe pas.
Vous pouvez créer le répertoire avec:
System.IO.Directory.CreateDirectory(System.IO.Path.GetDirectoryName(FileName));
Lorsqu'un objet Bitmap ou un objet Image est construit à partir d'un fichier, le fichier reste verrouillé pendant toute la durée de vie de l'objet. Par conséquent, vous ne pouvez pas modifier une image et la sauvegarder dans le même fichier d'origine. http://support.Microsoft.com/?id=814675
Une erreur générique s'est produite dans GDI +, Image JPEG dans MemoryStream:
Image.Save(..) // throws a GDI+ exception because the memory stream is closed
http://alperguc.blogspot.in/2008/11/c-generic-erroroccocc-in-gdi.html
EDIT: J'écris juste de la mémoire. L'enregistrement dans un 'intermédiaire' MemoryStream
devrait fonctionner:
Par exemple, remplacez ceci:
Bitmap newBitmap = new Bitmap(thumbBMP);
thumbBMP.Dispose();
thumbBMP = null;
newBitmap.Save("~/image/thumbs/" + "t" + objPropBannerImage.ImageId, ImageFormat.Jpeg);
avec quelque chose comme:
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);
}
}
essaye ça.
picturebox1.Image = Image.FromFile(FileName);
Bitmap bm = new Bitmat(pictureBox1.Image);
Image img = (Image)b;
img.Save(FileName, ImageFormat.Bmp);
Essaye ça:
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;
}
}
}
Comme @Jalal Aldeen Saa'd l'a dit, la zone d'image utilise le fichier et est verrouillée contre le remplacement de fichier.
//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?
Cela peut aussi arriver si vous oubliez d'ajouter le nom de fichier:
bm.Save(@"C:\Temp\Download", System.Drawing.Imaging.ImageFormat.Png);
Et peut être corrigé en ajoutant le nom du fichier:
bm.Save(@"C:\Temp\Download\Image.png", System.Drawing.Imaging.ImageFormat.Png);
Remarque: vous n'avez pas réellement besoin d'ajouter l'extension pour que cela fonctionne.
essayez ça va marcher
public void SavePicture()
{
Bitmap bm = new Bitmap(this.myBitmap)
bm.Save("Output\\out.bmp" ,System.Drawing.Imaging.ImageFormat.Bmp );
}