修改图片,保存并替换原图片时,“GDI+ 中发生一般性错误”

在使用System.Drawing.Image.Save 方法保存图片时会出现,“GDI+ 中发生一般性错误”。

      (猜测)这是因为加载的原图片资源没有得到释放,那么在Save新图片时,会强制将原图片删除,但此时原图片还在被使用,所有发生错误。想到的解决办法1:复制一份,将原图片dispose()。使用图片的Clone()方法,但是没有达到希望的效果,依然不行。办法2:使用Graphic对象绘制了一份,然后将原来的图片释放。该方法可行。

      注:使用using语句简化资源释放的过程,并且能够保证资源的恰当释放。

修改图片,保存并替换原图片时,“GDI+ 中发生一般性错误”修改图片,保存并替换原图片时,“GDI+ 中发生一般性错误”

 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     }

 

 

 

你可能感兴趣的:(图片)