保存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();
}
}
修正后的代码工作正常。
分享到:
相关推荐
导致图片文件被死锁无法释放资源,导置重写资源时出现一般性错误。 解决方法将代码改成以下代码 代码如下: Bitmap oImage = new Bitmap(ImageUrl);//从图片文件中读取图片流 Bitmap OldImage = new Bitmap...
基于VC++语言,VS平台开发,应用GDI+库,双缓冲,实现图片旋转,屏幕不闪烁。代码量不大,简单易学。
Bitmap b(image.GetWidth(),image.GetHeight());如何使用GDI+制作圆形图片(类似QQ圆形头像)(MFC,VC)
3.输出为内存Bitmap 4.对话框程序下快速使用打印支持 5.检测纸张大小,自动将图形分页打印输出 这是示例,也是解决方案... GDI+系列教程1:点击测试 http://download.csdn.net/source/1507159 GDI+系列教程2:...
GDI+内存创建bitmap,并将其保存为各种图像。以及将其与byte()、IStream、StdPicture、Bitmap的转换
我们首先介绍一下GDI+的新特性以及其编程方式的改变,然后介绍用Visual C++.net在基于对话框和单文档/多文档等应用程序中使用GDI+的一般方法。 GDI+新特性 GDI+与GDI相比,增加了下列新的特性: 1、渐变...
CGdiPlusBitmapTest GDI+ 显示各式图片 JPG BMP PNG VC
Integrating+BitMap+Structure+deeply+inside+ClickHouse.pdf
//以下假设你已经配置好VC6的GDI+环境 1.新建一个基于CScrollView的单文档程序, 2.在stdafx.h内添加如下代码: #ifndef ULONG_PTR #define ULONG_PTR unsigned long* #endif #include "GdiPlus.h" using namespace ...
这个功能用到的地方很多,GDI+是系统的工具,但是发布较晚,所以没有完全普及。...这个函数可以将 StdPicture 对象用 GDI+解码器保存为 JPEG格式文件。 Quality参数是清晰度,越低越模糊,但是压缩更高。
用GDI+的BitmapData获取BMP格式图形文件的像素值,并保存为.bin文件
VC2015实现简单的整个屏幕截图保存为jpg, 然后再该图片上根据需要裁剪特定大小的图片在另存jpg, 以及其他范例。
使用Delphi+GDI实现图片的镜像翻转,有需要的可以试试。
vs2010 mfc 中采用gdi+绘图,实现简单的图层功能,图层选择,返回图层graphics和bitmap指针对象,以在图层上绘图
GDI+不但在功能上比GDI 要强大很多,而且在代码编写方面也更简单,因此会很快成为Windows图形图像程序开发的首选。
处理bitmap内存溢出问题
用GDI+的Bitmap类实现类似于,拍照后选择图像的效果,除要选择的区域其他图像区域都变暗50%.
GDI对象定义了GDI函数使用的工具和环境变量,而GDI函数使用GDI对象绘制各种图形,在C#中,进行图形程序编写时用到的是GDI+(Graphics Device Interface Plus图形设备接口)版本,GDI+是GDI的进一步扩展,它使我们...
添加现有项GDIplus.Lib到工程中在**view.h文件中添加两行:private : ULONG_PTR gdiplusToken;Stdafx.h文件的最后添加两行:#include<gdiplus.h>//示例,这两行using namespace Gdiplus;// CGDIFirstView 消息处理...
vc2008, gdi+, 实现图片的显示,选择,分页,相应相关鼠标事件,其中有比较详细的说明