保存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();
}
}
修正后的代码工作正常。
分享到:
相关推荐
### GDI+中发生一般性错误的理解与处理 #### GDI+简介 GDI+(Graphics Device Interface Plus)是微软为Windows平台开发的一套绘图应用程序接口,它提供了丰富的图形和图像处理功能,如绘制线条、形状、图像,以及...
然而,在实际应用中,可能会遇到一些错误,如“GDI+中发生一般性错误”,这通常是由于资源管理不当导致的。本文将深入探讨这个问题,并提供一种解决方案。 首先,让我们分析错误的原因。`System.Drawing.Image.From...
在GDI+中,`Bitmap`类用于表示位图图像,我们可以使用`Bitmap::FromFile`方法从文件加载图片,然后用`Graphics`对象的`DrawImage`方法在窗口上显示图片。 3. **全屏模式** 要实现全屏查看图片,需要改变窗口样式...
在VC++中使用GDI+,首先需要包含对应的头文件,如 `<windows.h>` 和 `<gdiplus.h>`,然后初始化GDI+,一般在程序开始时调用GdiplusStartup函数。完成工作后,记得调用GdiplusShutdown来释放资源。 压缩包中的"文档....
在Windows Mobile版本的GDI+中缺失的显著特性包括: - 文本支持 - 世界变换支持。一般而言,变换仅在`Path`对象上支持 - 许多图像操作 从性能角度来看,GDI+是一个相对较慢的API,因此需要谨慎且适度地使用。将复杂...
Bitmap类用于处理像素级别的图像操作,Image类则用于一般性的图像管理。 4. **几何图形**:GDI+提供Path类,可以组合复杂的几何形状,并支持贝塞尔曲线等高级图形。 5. **图形变换**:通过Matrix类,可以进行平移...
GDI+ 中发生一般性错误 或 **进程占用...的错误,以下是改进办法 (1)改为流的模式 (2)显示别读取裁剪后的文件,而直接用了个Image的子类对象Bitmap就OK了, 希望对大家有帮助 本经验从CSDN上没直接查出答案, 但找到了...
1 双线性补点 效率低,质量一般 效率低,质量高 2 平均值算法 效率低,质量好 效率高,质量差 static BYTE GetRValue12(COLORREF Clr12Bit); static BYTE GetGValue12(COLORREF Clr12Bit); static BYTE ...
通过这样的程序,新手可以学习到图像处理的基础知识,包括颜色模型、像素操作以及如何在VC++环境中使用GDI+进行图形编程。这个小项目不仅可以帮助理解图像转换的原理,还可以提升编程技巧,是学习计算机图形学的一个...
在处理图片文件时,注意正确处理可能出现的异常,例如GDI+的一般性错误。 10. **事件驱动编程**: 与用户交互的事件,如鼠标点击和拖动,需要正确绑定到对应的事件处理器,以便在用户操作时执行绘图动作。 通过...
2. **Image类**:这是GDI+中的关键类,用于表示和操作图像。通过Image类,我们可以加载不同格式的图片(如JPEG、PNG、BMP等),获取图像信息,并将其保存为新的格式。 3. **Bitmap类**:Bitmap是Image类的一个子类...
在IT行业中,Delphi是一种基于Pascal语言的集成开发环境,以其高效性和强大的Windows应用程序开发能力而闻名。本文将深入探讨如何使用Delphi实现简单位图(也称为图标)的拼接,这是一个在图形用户界面设计中常见的...
接下来,`Image`类是`Bitmap`和`Metafile`的抽象基类,提供了对图像的一般性操作。`Image`类提供了许多属性,如`Height`和`Width`用于获取图像的高度和宽度,`HorizontalResolution`和`VerticalResolution`分别获取...
在数字图像处理中,VC++的优势在于它可以直接操作内存,快速处理大量像素数据,同时拥有丰富的库支持,如Windows SDK中的GDI+和DirectX,能够方便地进行图像显示、读写及变换。 二、数字图像处理基础知识 数字图像...
在实际开发中,CBitmapPicture控件可能还包含了错误处理和资源管理机制,以确保位图的正确加载和释放,防止内存泄漏。同时,为了提高性能,可能会有缓存机制来避免不必要的重复加载和绘制。 总结起来,...
1. **GDI+错误**:在视频捕获和图像处理过程中,可能会遇到GDI+(Graphics Device Interface Plus)的一般性错误。这通常与资源管理不当有关,如未能正确释放图形设备上下文。 2. **实时监控延迟**:由于线程管理和...
//另外,imgPath必须首先创建,否则会产生GDI+的一般性错误。 path=System.Web.HttpContext.Current.Server.MapPath(path); 使用if(!System.IO.Directory.Exists(path))System.IO.Directiory.CreateDirector
3. 复制像素数据:使用`GetBitmapBits()`函数从DDB中提取像素数据,并将其复制到新分配的DIB内存中。 4. 创建DIB位图句柄:使用`CreateDIBSection()`函数创建一个DIB位图,这个函数会返回一个表示DIB的位图句柄...
2. **字符串长度**:设定合理的验证码长度,一般为4到6位,既能保证用户可读性,又能提供一定的安全性。 3. **颜色生成**:为了视觉混淆,验证码中的每个字符可能有不同的颜色。可以使用C#的`Color`结构体和随机数...