修改图片,保存并替换原图片时,“GDI+ 中发生一般性错误”
在使用System.Drawing.Image.Save 方法保存图片时会出现,“GDI+ 中发生一般性错误”。
(猜测)这是因为加载的原图片资源没有得到释放,那么在Save新图片时,会强制将原图片删除,但此时原图片还在被使用,所有发生错误。想到的解决办法1:复制一份,将原图片dispose()。使用图片的Clone()方法,但是没有达到希望的效果,依然不行。办法2:使用Graphic对象绘制了一份,然后将原来的图片释放。该方法可行。
注:使用using语句简化资源释放的过程,并且能够保证资源的恰当释放。
1 private void openBtn_Click(object sender, EventArgs e) 2 { 3 using (mainOpenFileDialog) 4 { 5 // 打开对话框设置 6 mainOpenFileDialog.Filter = "所有文件(*.*)|*.*|(*.jpg)|*.jpg|(*.png)|*.png|(*.ico)|*.ico"; 7 mainOpenFileDialog.FilterIndex = 2; 8 mainOpenFileDialog.InitialDirectory = Application.StartupPath; 9 10 if (mainOpenFileDialog.ShowDialog() == DialogResult.OK) 11 { 12 imageUrl = mainOpenFileDialog.FileName; 13 14 // 从本地读取图片,并释放资源 15 using (Bitmap tempImage = Bitmap.FromFile(imageUrl) as Bitmap) 16 { 17 // 创建本地图片的一个副本,由image引用,这样读取到的图片资源就可以释放,接下来操作的就是刚刚创建的副本 18 image = new Bitmap(tempImage.Width, tempImage.Height, PixelFormat.Format24bppRgb); 19 using (Graphics g = Graphics.FromImage(image)) 20 { 21 g.DrawImage(tempImage, 0, 0); 22 } 23 } 24 25 mainPicBox.Image = image; 26 mainPicBox.BorderStyle = BorderStyle.Fixed3D; 27 mainPicBox.SizeMode = PictureBoxSizeMode.Zoom; 28 } 29 } 30 } 31 32 private void modifyBtn_Click(object sender, EventArgs e) 33 { 34 ImageOperation.GetPixel_Example(image); 35 this.mainPicBox.Invalidate(); 36 } 37 38 private void saveBtn_Click(object sender, EventArgs e) 39 { 40 try 41 { 42 image.Save(imageUrl, ImageFormat.Jpeg); 43 MessageBox.Show("保存成功"); 44 } 45 catch (Exception ex) 46 { 47 MessageBox.Show(ex.Message); 48 } 49 } 50 } 51 52 53 public class ImageOperation 54 { 55 public static void GetPixel_Example(Bitmap bitmap) 56 { 57 for (int i = 0; i < bitmap.Width; i += 2) 58 for (int j = 0; j < bitmap.Height; j += 2) 59 bitmap.SetPixel(i, j, Color.Black); 60 } 61 }