修改图片,保存并替换原图片时,“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     }

 

 

 

posted @ 2013-04-20 15:07  niaomingjian  阅读(730)  评论(0编辑  收藏  举报