当前位置: 首页 > news >正文

保存Bitmap到内存流中引发“GDI+中发生一般性错误”

保存Bitmap到流中引发“GDI+中发生一般性错误”

-----------------------------------------------------------------------------------------

在.NET中进行图像很容易处理引发“GDI+中发生一般性错误”,最近我就碰到了一次。其场景如下:

SQL Server数据库表中有一CoverImage字段,其类型为varbinary,用于保存图像的二进制数据。

我需要在一个Windows Form应用程序中使用PictureBox(名为picCoverImage)从本地硬盘加载图片文件显示,然后,再将图像本身塞入到数据库中。

我采用的方法是将PictureBox的Image属性引用的图像对象先转换为字节数组,再使用LINQ to SQL更新回数据库:

//……

if (picCoverImage.Image != null)
{

using (MemoryStream mem = new MemoryStream())
{
picCoverImage.Image.Save(mem, picCoverImage.Image.RawFormat);

//book是LINQ to SQL生成的数据实体对象
book.CoverImage = new Binary(mem.ToArray());

}

}

//……

然而,很奇怪的是,上述代码在往数据库中新加图像时是成功的,而一旦要修改时picCoverImage.Image.Save(...)一句总引发“GDI+中发生一般性错误”。

仔细对比“新建”与“修改”的不同流程:

“新建”时,我是使用OpenFileDialog选择文件,然后设置PictureBox的ImageLocation属性装载并显示图片,上述代码运行正常。

“修改”时,我从数据库中取出图像数据,使用以下方法在PictureBox中显示图片:

//显示图像
if (book.CoverImage != null)
{
using (MemoryStream mem = new MemoryStream(book.CoverImage.ToArray()))
{
picCoverImage.Image = new Bitmap(mem);
}
}

现在,再次尝试将PictureBox中的Image写入到内存流中,picCoverImage.Image.Save(...)一句就引发“GDI+中发生一般性错误”。

百思不得其解。估计是PictureBox内部对Image引用的图像进行了特殊处理,也没时间去用Reflector等工具去深挖细掘,最后是用这个笨方法解决的:

克隆一个新的Bitmap对象。

修正后的代码如下:

//更新图像
if (picCoverImage.Image != null)
{

using (MemoryStream mem = new MemoryStream())
{
//克隆Bitmap对象
Bitmap bmp = new Bitmap(picCoverImage.Image);
bmp.Save(mem, picCoverImage.Image.RawFormat);
book.CoverImage = new Binary(mem.ToArray());
bmp.Dispose();
}
}

修正后的代码工作正常。

相关文章:

  • Asp.net Mvc使用PagedList分页
  • [Web开发] PSD 转换成HTML/CSS 的工具网站
  • 算法练习--整数拆分为素数乘积
  • 算法练习--卡片游戏
  • [IE编程] 了解Urlmon.dll和Wininet.dll
  • 算法练习--小球下落
  • 在LINQ to SQL中处理“更新已被其它用户删除对象”的错误
  • 算法练习--打印Cantor 数表
  • 企业中的4种人才
  • Sun的启示------技术在企业发展中的分量
  • Computer Science 学习第四章--CPU 指令集及指令处理
  • 领域模型驱动应用心得....
  • 算法练习--除法
  • 移动互联网 3G时代的“新宠”
  • 算法练习--双基回文数
  • 【刷算法】求1+2+3+...+n
  • 11111111
  • angular2开源库收集
  • interface和setter,getter
  • JavaScript设计模式系列一:工厂模式
  • js对象的深浅拷贝
  • k8s如何管理Pod
  • orm2 中文文档 3.1 模型属性
  • Python爬虫--- 1.3 BS4库的解析器
  • rc-form之最单纯情况
  • Terraform入门 - 1. 安装Terraform
  • yii2中session跨域名的问题
  • 和 || 运算
  • 紧急通知:《观止-微软》请在经管柜购买!
  • 快速体验 Sentinel 集群限流功能,只需简单几步
  • 利用阿里云 OSS 搭建私有 Docker 仓库
  • 使用putty远程连接linux
  • 微信小程序填坑清单
  • const的用法,特别是用在函数前面与后面的区别
  • PostgreSQL之连接数修改
  • scrapy中间件源码分析及常用中间件大全
  • ​queue --- 一个同步的队列类​
  • #在 README.md 中生成项目目录结构
  • (1/2) 为了理解 UWP 的启动流程,我从零开始创建了一个 UWP 程序
  • (11)工业界推荐系统-小红书推荐场景及内部实践【粗排三塔模型】
  • (6)【Python/机器学习/深度学习】Machine-Learning模型与算法应用—使用Adaboost建模及工作环境下的数据分析整理
  • (Note)C++中的继承方式
  • (附源码)springboot社区居家养老互助服务管理平台 毕业设计 062027
  • (附源码)计算机毕业设计ssm本地美食推荐平台
  • (九)c52学习之旅-定时器
  • (三十五)大数据实战——Superset可视化平台搭建
  • (转)PlayerPrefs在Windows下存到哪里去了?
  • (最优化理论与方法)第二章最优化所需基础知识-第三节:重要凸集举例
  • .bat批处理(七):PC端从手机内复制文件到本地
  • .NET CF命令行调试器MDbg入门(四) Attaching to Processes
  • .NET gRPC 和RESTful简单对比
  • .net 生成二级域名
  • .NET 使用配置文件
  • .NetCore Flurl.Http 升级到4.0后 https 无法建立SSL连接
  • .NET开源快速、强大、免费的电子表格组件