博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
修改图片,保存并替换原图片时,“GDI+ 中发生一般性错误”
阅读量:6620 次
发布时间:2019-06-25

本文共 2567 字,大约阅读时间需要 8 分钟。

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

 

 

 

转载于:https://www.cnblogs.com/niaomingjian/archive/2013/04/20/3032605.html

你可能感兴趣的文章
外媒:开源安全软件到底安不安全?
查看>>
达索系统与中国的那些创新
查看>>
ARM与服务器厂商建绿色计算产业联盟
查看>>
《Drupal实战》——2.6 小结
查看>>
《C语言及程序设计》实践参考——二分法解方程
查看>>
java thread中的wait()和notify()
查看>>
2016最新搜索引擎优化(SEO)重点要素
查看>>
当Web访问性能出现问题,如何深探?
查看>>
【IOS-COCOS2D-X 游戏开发之二】【必看篇】总结阐述COCOS2D-X与COCOS2D-IPHONE区别;
查看>>
Angularjs 源码分析1
查看>>
ExtJs之Ext.core.Element
查看>>
六套 App:构建我的产品设计工作流
查看>>
WebSocket探秘
查看>>
java 自适应响应式 网站 源码 SSM 生成 静态化 手机 平板 PC
查看>>
eoLinker-API_Shop_通讯服务类API调用的代码示例合集:短信服务、手机号归属地查询、电信基站查询等...
查看>>
因为小程序的scroll-view组件不能下拉刷新我做了个开源项目
查看>>
JavaScript 垃圾回收机制
查看>>
震惊! 这么实用的 chrome 扩展你居然没用过!
查看>>
前端面试回忆录 - 滴滴篇 - 凉面
查看>>
jxl导入Excel 切割List 并使用MyBatis批量插入数据库
查看>>