Asp.Net教程,WinForm教程,Asp.Net MVC,vs2008教程,vs2010教程,Silverlight技术,源码下载,Asp.Net视频教程
全站热门标签
vs2010 Silverlight 存储过程 水晶报表 ADO.NET JavaScript LINQ AjaxPro DataGridView 面向对象 Extjs GridView XML DevExpress HTML教程 Oracle jQuery 分页 GDI+ Visual C++2010 MySQL Office2010 WPF MVC Dojo WCF4.0 VB.NET Sql2005 textbox cookie WCF WinForm Discuz!NT SQL经典语句 T-SQL checkbox ASPxGridView F# asp.net SQL VS2008新特性 DropDownList Access TreeView Ajax VS2008 页面执行时间 Flex 字符串 回调 VB2005 DataSet C#时间 ASP.NET性能优化 用户在线检测 动画
尚未分类 LINQ教程 Enterprise技术 性能优化/调试 水晶报表与打印 安全与加密图形图像 文件处理 基础教程 Web Services 内置对象 控件示例 正则表达式\采集 ADO.NET 缓存\泛型\线程 XML技术 Url重写\静态页 vs2008综合教程
当前位置: 主页 > ASP.NET教程 > 图形图像 >

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

时间:2010-03-06 13:52来源:未知 作者:admin 点击:

在.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();
                }
            }

修正后的代码工作正常。

(责任编辑:admin)
Tags:GDI+ Bitmap 内存流
责任编辑:admin
返回顶部
------分隔线----------------------------
推荐内容
骆驼户外男 真皮磨砂日常休闲鞋 低帮 2011秋冬新款 专柜正品特价 骆驼户外男 真皮磨砂日常休闲鞋 低帮 2011秋冬新款 专柜正品特价
  • 绘制几何图形:使用android.graphics类

    如何在和机上绘制2D图形呢?这是许多android游戏开发都是常提到的问题,在android SDK 当中,并没有Java Graphics2D的函数可以使用,...

  • .Net下二进制形式的文件(图片)的存储与读取

    看到标题,二进制形式的文件是很广的。这里我主要谈谈图片以二进制形式的数据读取和存储。 .Net下图片的常见存储与读取凡是有以下几种: 存储图片:以二进制的形式存...

  • C#图片验证码破解

    1 public class GetImageValue 2 { 3 // 设定图片RGB字符串 4 string []ArrayList = new stri...

  • ASP.NET画图系列之实现Curve图(曲线图)

    ASP.NET画图系列,今天要实现的是Curve图,如果各位朋友有什么不明白的可以留言或Email给我,我的Email:gfreesky@gmail.com 废...

  • ASP.NET画图系列之实现Bar图(柱状图)

    前面已经实现了Pie和Curve图,今天我们来实现Bar,就是柱状图,这个的实现和前面2种基本上差不多,还是让我们先看看效果再说. 效果图: 下面开始页面部分:...

  • ASP.NET画图系列之实现Pie图(圆饼图)

    ASP.NET自身提供的画图功能也是很强大的,在实际的项目中有时也会经常用到的,实现这样的功能方法很多,诸如水晶报表之类也可以实现,但有时我们只想实现单一的某些...

  • ASP.NET 2.0 HttpHandler实现生成图片验证码(示例代码下载)

    学习整理了一下 (一).功能 用HttpHandler实现图片验证码 (二).代码如下 1. 处理程序文件 ValidateImageHandler.ashx代...

  • 两种获取灰度图像的方法

    在图像处理程序开发中,常会遇到将一幅彩色图像转换成灰度图像的情况,笔者在最近的一个项目中便遇到了这点。经过一翻努力最终解决,想想有必要分享一下,于是便写下此文。...

  • Asp.net网页截图的实现方法

    源代码如下: using System; using System.Drawing; using System.Drawing.Imaging; using S...

  • ASP.NET图片渐变轮换效果

    一.静态的 HTML HEAD title图片渐变轮换效果/title meta name=generator content=editplus meta na...

  • ASP.NET添加水印(从Discuz!Nt挖出来的)

    这是从 Discuz!Nt 挖出来的代码 添加水印的强大代码。功能很强大。可以添加图片水印和文字水印两种 编写也很好。添加进去的效果非常好。 供大家欣赏 现在就...

  • ASP.NET2.0图片格式转换

    第一步:打开页面 第二步:选择一副Jpg格式的图片 第三步:转换为GIF格式,明显看出图片画质降低。 后台代码: using System; using Sys...

  • 添加文字水印类代码

    usingSystem; usingSystem.Collections.Generic; usingSystem.Text; usingSystem.Draw...

  • ASP.NET生成随机验证码示例

    常用的生成验证码程序,图片效果如下: 源程序如下: using System; using System.Drawing; using System.Drawi...