在使用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 try41 {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 ImageOperation54 {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 }