C# Bitmap() win7 出现GDI+ 中发生一般性错误 100分现在等

yl900127 2014-11-09 01:33:26
在win7和server 2008 下出现的, server2003 可以正常运行。xp还没有检验过。

有信息说可能是win7下的显卡驱动问题,连接:
https://social.msdn.microsoft.com/Forums/zh-CN/a94148d1-95e6-4f45-86bf-09a020e40333/egraphicsclear-gdi-?forum=visualcshartzhchs



捕捉到 System.Runtime.InteropServices.ExternalException
HResult=-2147467259
Message=GDI+ 中发生一般性错误。
Source=System.Drawing
ErrorCode=-2147467259
StackTrace:
在 System.Drawing.Bitmap..ctor(Stream stream)
在 Analysis.PictureWatermark.addWatermark(SourceArgs sourceModel) 位置 XXXXX.cs:行号 99
InnerException:



using (FileStream fs = File.OpenRead(sourceModel.FilePath[i]))//OpenRead
{
int filelength = 0;
filelength = (int)fs.Length; //获得文件长度
buffer = new byte[filelength]; //建立一个字节数组
fs.Read(buffer, 0, filelength); //按字节流读取
try
{
bmp = new Bitmap(fs);
}
catch (ExternalException eex)
{
Console.WriteLine(eex.Message);
}
}


...全文
494 19 打赏 收藏 转发到动态 举报
写回复
用AI写文章
19 条回复
切换为时间正序
请发表友善的回复…
发表回复
qq_30853417 2016-11-01
  • 打赏
  • 举报
回复
请问楼主是如何解决的。谢谢。
yl900127 2014-11-10
  • 打赏
  • 举报
回复
http://pan.baidu.com/s/1AjIyi 这里是解决GDI+ 报错的资料, 是EmguCv完成的。 希望对遇到类似的问题的同学有帮助。
yl900127 2014-11-10
  • 打赏
  • 举报
回复
引用 16 楼 effun 的回复:
Read以后,把流的当前位置重置到流的最前面。 fs.Position = 0
这个流是一次性的, 应该不会受影响吧? 而且老的图片是好的, 其实以前不用这个方法的, 只是这一直在调试 用了很多不同的方式。
effun 2014-11-10
  • 打赏
  • 举报
回复
Read以后,把流的当前位置重置到流的最前面。 fs.Position = 0
yl900127 2014-11-10
  • 打赏
  • 举报
回复
引用 13 楼 github_22161131 的回复:
gdi+应该是认为这个图片是有问题的。我这里可以打开,但是如果打开后直接再保存成jpg格式就会出那个一般性错误。而如果稍作处理,比如lock再unlock,或者用graphics画一下,再保存就没有错误了。 分析了下,这个jpg里面有两个自定义tag,b000和b001里面有道路的名称、车牌号、车的颜色和“电子警察原始数据”等信息。原始文件把他们写到了exif ifd里,而我稍作处理再保存的jpg是把它们写到了ifd0里。我猜是因为这个区别导致了gdi+出错。 也有人是有些图片win8打不开了,win7和之前的还好着,和你这个有点类似。微软对于gdi+有不少补丁,有些是打了补丁之后出的问题,然后再有些补丁又修复了。简单点的方案就是安装所有系统更新试试,如果不行看下c:\windows\system32\WindowsCodecs.dll 这个文件的版本信息,然后搜下有没有hotfix。 另外,你的代码里面打开了文件,读到buffer里面,再把fs流传递给gdi+这不是正常的做法。虽然gdi+无视了这个fs的position,照样还能从头读文件,但是最好别这么写。
引用 14 楼 D56233577 的回复:
[quote=引用 13 楼 github_22161131 的回复:] gdi+应该是认为这个图片是有问题的。我这里可以打开,但是如果打开后直接再保存成jpg格式就会出那个一般性错误。而如果稍作处理,比如lock再unlock,或者用graphics画一下,再保存就没有错误了。 分析了下,这个jpg里面有两个自定义tag,b000和b001里面有道路的名称、车牌号、车的颜色和“电子警察原始数据”等信息。原始文件把他们写到了exif ifd里,而我稍作处理再保存的jpg是把它们写到了ifd0里。我猜是因为这个区别导致了gdi+出错。 也有人是有些图片win8打不开了,win7和之前的还好着,和你这个有点类似。微软对于gdi+有不少补丁,有些是打了补丁之后出的问题,然后再有些补丁又修复了。简单点的方案就是安装所有系统更新试试,如果不行看下c:\windows\system32\WindowsCodecs.dll 这个文件的版本信息,然后搜下有没有hotfix。 另外,你的代码里面打开了文件,读到buffer里面,再把fs流传递给gdi+这不是正常的做法。虽然gdi+无视了这个fs的position,照样还能从头读文件,但是最好别这么写。
我这里什么都不处理,直接保存都是正常的。我更新服务都是关的,从来不打补丁。[/quote] 感谢提醒, 昨天我已经把这个问题解决了 我用了emgucv 这东西还是比较好使的, 虽说一开始使用需要点时间, 稍后我会把我找到的示例代码和相关文件放到云盘里, 供大家使用, 再次谢谢你们!
D56233577 2014-11-09
  • 打赏
  • 举报
回复
引用 13 楼 github_22161131 的回复:
gdi+应该是认为这个图片是有问题的。我这里可以打开,但是如果打开后直接再保存成jpg格式就会出那个一般性错误。而如果稍作处理,比如lock再unlock,或者用graphics画一下,再保存就没有错误了。 分析了下,这个jpg里面有两个自定义tag,b000和b001里面有道路的名称、车牌号、车的颜色和“电子警察原始数据”等信息。原始文件把他们写到了exif ifd里,而我稍作处理再保存的jpg是把它们写到了ifd0里。我猜是因为这个区别导致了gdi+出错。 也有人是有些图片win8打不开了,win7和之前的还好着,和你这个有点类似。微软对于gdi+有不少补丁,有些是打了补丁之后出的问题,然后再有些补丁又修复了。简单点的方案就是安装所有系统更新试试,如果不行看下c:\windows\system32\WindowsCodecs.dll 这个文件的版本信息,然后搜下有没有hotfix。 另外,你的代码里面打开了文件,读到buffer里面,再把fs流传递给gdi+这不是正常的做法。虽然gdi+无视了这个fs的position,照样还能从头读文件,但是最好别这么写。
我这里什么都不处理,直接保存都是正常的。我更新服务都是关的,从来不打补丁。
winnowc 2014-11-09
  • 打赏
  • 举报
回复
gdi+应该是认为这个图片是有问题的。我这里可以打开,但是如果打开后直接再保存成jpg格式就会出那个一般性错误。而如果稍作处理,比如lock再unlock,或者用graphics画一下,再保存就没有错误了。 分析了下,这个jpg里面有两个自定义tag,b000和b001里面有道路的名称、车牌号、车的颜色和“电子警察原始数据”等信息。原始文件把他们写到了exif ifd里,而我稍作处理再保存的jpg是把它们写到了ifd0里。我猜是因为这个区别导致了gdi+出错。 也有人是有些图片win8打不开了,win7和之前的还好着,和你这个有点类似。微软对于gdi+有不少补丁,有些是打了补丁之后出的问题,然后再有些补丁又修复了。简单点的方案就是安装所有系统更新试试,如果不行看下c:\windows\system32\WindowsCodecs.dll 这个文件的版本信息,然后搜下有没有hotfix。 另外,你的代码里面打开了文件,读到buffer里面,再把fs流传递给gdi+这不是正常的做法。虽然gdi+无视了这个fs的position,照样还能从头读文件,但是最好别这么写。
yl900127 2014-11-09
  • 打赏
  • 举报
回复
引用 11 楼 D56233577 的回复:
调试下,看看你传的路径对不对。
一切代码都是常规的
D56233577 2014-11-09
  • 打赏
  • 举报
回复
调试下,看看你传的路径对不对。
D56233577 2014-11-09
  • 打赏
  • 举报
回复
我win7,正常啊。

yl900127 2014-11-09
  • 打赏
  • 举报
回复
引用 8 楼 D56233577 的回复:
[quote=引用 7 楼 yl900127 的回复:] [quote=引用 6 楼 D56233577 的回复:] 把你的工程和图片传上来绝对能解决你的问题。
你吧你的邮箱给我吧。 我吧工程和图片给你 [/quote] 随便传个网盘吧,其他人也可以帮你解决。[/quote] http://pan.baidu.com/s/1i3j6YS9 就这个图片 代码我就不贴了。,, 反正在 Image.FromFile 或 Bitmap初始化的时候 就出现了GDI+中发生一般性错误。 目前测试在win2003 下可以正常运行, win7和2008 不行
D56233577 2014-11-09
  • 打赏
  • 举报
回复
引用 7 楼 yl900127 的回复:
[quote=引用 6 楼 D56233577 的回复:] 把你的工程和图片传上来绝对能解决你的问题。
你吧你的邮箱给我吧。 我吧工程和图片给你 [/quote] 随便传个网盘吧,其他人也可以帮你解决。
yl900127 2014-11-09
  • 打赏
  • 举报
回复
引用 6 楼 D56233577 的回复:
把你的工程和图片传上来绝对能解决你的问题。
你吧你的邮箱给我吧。 我吧工程和图片给你
D56233577 2014-11-09
  • 打赏
  • 举报
回复
把你的工程和图片传上来绝对能解决你的问题。
yl900127 2014-11-09
  • 打赏
  • 举报
回复
引用 3 楼 D56233577 的回复:
Image用完再干掉
img.Dispose()
这个知道的, 关键是 执行img = System.Drawing.Image.FromFile(sourceModel.FilePath[i]); 这行的时候就已经有异常了, 你看下我截的图 就知道了
D56233577 2014-11-09
  • 打赏
  • 举报
回复
引用 2 楼 yl900127 的回复:
[quote=引用 1 楼 D56233577 的回复:] 换种方式不行么
System.Drawing.Image img;
img = System.Drawing.Image.FromFile(sourceModel.FilePath[i]);
Bitmap bmp = new Bitmap(img);
不行, 这样写 会在img = System.Drawing.Image.FromFile(sourceModel.FilePath[i]); 这一行就报错了。 错误是一样的。 这个问题已经困扰好多年了。 这次发生的是新图片在win7和server2008 上出现这种错误,但老的图片在这两种系统上却没有, 关键新的图片在server2003上是好的。 所以我现在只能怀疑 可能是win7或2008系统 又或者是新图片的编码有问题, 但由于技术能力有限 一直验证不出来。。。。[/quote] 还会这样。。。
D56233577 2014-11-09
  • 打赏
  • 举报
回复
Image用完再干掉
img.Dispose()
yl900127 2014-11-09
  • 打赏
  • 举报
回复
引用 1 楼 D56233577 的回复:
换种方式不行么
System.Drawing.Image img;
img = System.Drawing.Image.FromFile(sourceModel.FilePath[i]);
Bitmap bmp = new Bitmap(img);
不行, 这样写 会在img = System.Drawing.Image.FromFile(sourceModel.FilePath[i]); 这一行就报错了。 错误是一样的。 这个问题已经困扰好多年了。 这次发生的是新图片在win7和server2008 上出现这种错误,但老的图片在这两种系统上却没有, 关键新的图片在server2003上是好的。 所以我现在只能怀疑 可能是win7或2008系统 又或者是新图片的编码有问题, 但由于技术能力有限 一直验证不出来。。。。
D56233577 2014-11-09
  • 打赏
  • 举报
回复
换种方式不行么
System.Drawing.Image img;
img = System.Drawing.Image.FromFile(sourceModel.FilePath[i]);
Bitmap bmp = new Bitmap(img);
class CSBitmap //Bitmap类,特点紧约型数据结构,GetPixel效率高,放弃调色板,自动支持4种色深,特有的12位颜色更接近人眼可识别颜色数目;有多种缩放,色深转换,拷贝,剪切,和hBitmap转换,显示等功能;支持串行化。支持1,12,24,32位位图,对应适用于所有函数,相比于HBitmap和CSBitmap对象要简单,可直接操作数据区;同时可用于1,4,8,12,16,24,32位二维数列的储存,部基本函数(GetPixel,SetPixel)支持; { public: CSBitmap(void); ~CSBitmap(void); unsigned int Width; //Bitmap的宽 unsigned int Height; //Bitmap的高 DWORD BitSize; //Bitmap的数据区大小(字节) BYTE* pBitData; //Bitmap的数据区指针 unsigned int BitCount; //Bitmap的色深 bool SetAttribute(unsigned int mWidth=NULL, unsigned int mHeight=NULL, unsigned int mBitCount=NULL); //设置Bitmap的属性,Bitmap会被清除 mWidth Bitmap的宽度,为NULL则不改变 mHeight Bitmap的高度,为NULL则不改变 mBitCount Bitmap的色深,为NULL则不改变 bool ImportBits(BYTE* lpBits, int mBitSize=NULL); //拷贝Bits数据进对象数据区 lpBits 拷贝数据的指针 mBitSize 拷贝数据的字节数 COLORREF GetPixel(unsigned int x, unsigned int y); //获得某点的原始数值,当为12,24,32位数时,则为RGB值 X,y 需要获取点的坐标 bool SetPixel(unsigned int x, unsigned int y, COLORREF clr); //获得某点的原始数值,当为12,24,32位数时,则为RGB值 X,y 需要设置点的坐标 bool StretchDIB(CSBitmap* DestBmp, unsigned int mWidth, unsigned int mHeight, unsigned int mFlag=0); //缩放 DestBmp用于获取缩放后图片的指针 mWidth, mHeight缩放后大小 mFlag缩放算法 取值 算法 缩小 放大 0 逆向寻点算法 效率高,质量一般 效率高,质量 1 双线性补点 效率低,质量一般 效率低,质量高 2 平均值算法 效率低,质量好 效率高,质量差 static BYTE GetRValue12(COLORREF Clr12Bit); static BYTE GetGValue12(COLORREF Clr12Bit); static BYTE GetBValue12(COLORREF Clr12Bit); //用于12位图的获取RGB量,24位图,32位图的COLOR离请用GDI的GetPixel() Clr12Bit 对12位图GetPixel获得的原始值 static COLORREF RGB12(BYTE R, BYTE G, BYTE B); //用于12位图的RGB合成,24位图,32位图的COLOR合成请用GDI的RGB() static COLORREF Color24To1(COLORREF Color24); //24位色深COLORREF转1位色深(黑白)值 static COLORREF Color24To12(COLORREF Color24); //24位色深COLORREF转12位色深值 static COLORREF Color1To24(COLORREF Color2); //1位色深COLORREF转24位,32位色深(黑白)值 static COLORREF Color12To24(COLORREF Color12); //12位色深COLORREF转24位,32位色深(黑白)值 bool ConvertTo1Bit(CSBitmap* DestBmp); //12,24,36位图片转换成1位色深图 DestBmp用于接收数据的DestBmp指针,转换过程包括自动参数重置 bool ConvertTo12Bit(CSBitmap* DestBmp); //1,24,36位图片转换成12位色深图 DestBmp用于接收数据的DestBmp指针,转换过程包括自动参数重置 bool ConvertTo24Bit(CSBitmap* DestBmp); //1,12,36位图片转换成24位色深图 DestBmp用于接收数据的DestBmp指针,转换过程包括自动参数重置 bool FromHandle(HBITMAP hBitmap); //从HBITMAP获得CSBitmap对象 bool CopyPaste(CSBitmap* DestBmp, unsigned int x, unsigned int y); //复制本CSBitmap至另一DestBmp的指定位置 DestBmp 目标,对象 X,y复制后图片左上角位置 bool PaintDIB(CDC* dcDest, int x,int y,unsigned int mWidth, unsigned int mHeight); //把本图片显示至CDC对象上,支持1,12,24,26位图 dcDest 目标dc(兼容DC) x,y 拷贝到dc上的位置 mWidth,mHeight拷贝后的大小 const CSBitmap& operator=(const CSBitmap &SBmp); }; //重载了 = 赋值操作符
C#完整教程以下是目录: 第一章 C#语言基础 5 1.1 C#语言特点 5 1.2 编写控制台应用程序 6 1.3 类的基本概念 10 1.4 C#的数据类型 13 1.5 运算符 20 1.6 程序控制语句 23 1.7 类的继承 26 1.8 类的成员 28 1.9 类的字段和属性 28 1.10 类的方法 30 1.11 类的多态性 36 1.12 抽象类和抽象方法 38 1.13 密封类和密封方法 39 1.14 接口 39 1.15 代表 42 1.16 事件 43 1.17 索引指示器 44 1.18 名字空间 45 1.19 非安全代码 46 习题 47 第二章 Windows编程的基础知识 48 2.1 窗口 48 2.2 Windows的消息系统 48 2.3 Windows编程接口和类库 49 2.4 Windows应用程序的基本结构 50 习题 57 第三章 常用控件和类的使用 58 3.1 控件通用属性 58 3.2 Form类 58 3.3 标签(Label)控件 59 3.4 按钮(Button)控件 60 3.5 事件处理函数的参数 60 3.6 文本框(TextBox)控件 61 3.7 Convert类 62 3.8 单选按钮(RadioButton)和GroupBox控件 62 3.9 Font类 63 3.10 多选框(CheckBox)控件 63 3.11 列表选择控件(ListBox) 65 3.12 下拉列表组合框(ComboBox)控件 66 3.13 ToolTip控件 66 3.14 超级链接(LinkLable)控件 67 3.15 定时(Timer)控件 67 3.16 DateTime类 68 3.17 菜单 69 3.18 工具条 70 3.19 状态栏(StatusBar)控件 72 3.20 鼠标事件 73 3.21 快捷菜单(ContextMenu) 74 3.22 综合例子:计算器 75 习题: 77 第四章 文本编辑器的实现 79 4.1 用RichTextBox控件实现文本编辑器 79 4.2 实现文本编辑器的剪贴板功能 80 4.3 实现文本编辑器的存取文件功能 80 4.4 修改字体属性 83 4.5 实现About对话框 84 4.6 实现文本编辑器查找替换功能 85 4.7 提示用户保存修改的文件 88 4.8 打印和打印预览 90 4.9 编写多文档界面应用程序 94 习题 100 第五章 图形图像编程 102 5.1 图形设备环境接口(GDI) 102 5.2 Graphics类 102 5.3 GDI+三种坐标系统: 103 5.4 GDI+常用的结构 104 5.5 画笔 105 5.6 创建画刷 106 5.7 基本图形的绘制和填充 110 5.8 Matrix类和图形的平移、变形、旋转 122 5.9 图形文件格式 124 5.10 图形框PictureBox控件 125 5.11 Bitmap类 126 5.12 图像剪贴板功能 130 5.13 图像的处理 133 习题 136 第六章 文件和流 137 6.1 用流读写文件 137 6.2 File类和FileInfo类 138 6.3 Directory类和DirectoryInfo类 140 6.4 例子:查找文件 143 6.5 例子:拆和合并文件 144 习题: 145 第七章 多线程程序设计 146 7.1 线程类(Thread)的属性和方法 146 7.2 线程的创建 147 7.3 建立线程类 148 7.4 线程的优先级 149 7.5 多个线程互斥 150 7.6 Monitor类 151 7.7 线程的同步:生产者和消费者关系 151 习题: 153 第八章 ADO.NET与数据操作 154 8.1 数据库基本概念 154 8.2 设计连接和不连接数据库应用程序的基本步骤: 154 8.3 用ACCESS创建数据库 155 8.4 结构化查询语言SQL 157 8.5 用Connection对象连接数据库。 158 8.6 Command对象 158 8.7 DataAdapter对象 159 8.8 DataSet对象 160 8.9 用DataGraid控件显示数据和数据绑定 162 8.10 不连接数据库应用程序的完整的例子 162 8.11 修改数据并保存修改的数据到源数据库 163 8.12 其它数据绑定控件 164 8.13 建立主从关系表 165 第九章 ASP.Net编程基础知识 167 9.1 网络基础 167 9.2 HTML标记语言 171 9.3 ASP.NET技术基础 181 第十章 Web服务器端控件 188 10.1 常用的ASP.NET服务器端控件 188 10.2 ASP.Net控件数据绑定 192 10.3 数据验证控件 209 10.4 DataGraid控件 219 10.5 AdRotator控件 235 10.6 Calender控件 236 10.7 Visual Studio.Net实现留言板 239 第十一章 ASP.NET内建对象 242 11.1 Request对象 242 11.2 Response对象 244 11.3 Cookie对象 246 11.4 Application对象 250 11.5 Session对象 253 11.6 Server 对象 257 习题 258 第十二章 可扩展标记语言 259 12.1 HTML及其缺点 259 12.2 SGML(标准通用置标语言) 259 12.3 XML(可扩展置标语言) 259 12.4 XML的文档格式 260 12.5 用XSL文件显示XML文档 261 12.6 .NET对XML的支持 265 12.7 ADO.NET和XML 268 12.8 使用Visual Studio.Net建立和显示XML文档 271 第十三章 Web服务 273 13.1 Web服务的概念和用途 273 13.2 建立Web服务 274 13.3 基于.Net的Web服务客户端程序 277 13.4 建立Web服务客户端程序一般方法 280 13.5 发布和发现Web服务 281
我将带领大家来系统学习Windows的窗口编程,包括消息、窗口、GDI绘图、游戏开发等。本课程比较基础,非常适合初学者入门,读者可以边学习边实践。具体的章节目录和课程内容如下所示:---------------------------------------------Windows游戏编程系列之1:GUI界面编程及游戏入门实战1、Windows创建第一个窗口 WinMain入口函数 5进行Windows编程的调试手法 6窗口从哪里来? 7窗口编程的步骤 7窗口编程需要的主要结构 8窗口编程需要的主要API 92、Windows的窗口过程与消息机制 如何留住窗口? 121)Windows的消息与消息循环 142)消息处理函数与常用消息 17)Windows的窗口过程函数 19 3、GDI编程之设备上下文 1)GDI的通用编程框架 222)GDI的绘图步骤 253)GDI获取设备句柄 254、GDI编程之绘制几何图形 画点、线 28颜色COLORREF 29矩形 29画圆、饼图、弦图 305、GDI编程之自定义画笔画刷画笔简介 32画刷简介 33画笔案例 33画刷案例 346、GDI编程之绘制文字 DrawText函数 35TextOut 函数 (wingdi.h) 36CreateFont函数 37绘制文本案例 377、GDI编程之绘制位图 位图简介 381)在资源添加位图资源 392)从资源加载位图: LoadBitmap 393)创建一个与当前DC相匹配的DC(内存DC) 394)将bitmap放入匹配的DC:SelectObject 405)成像(1:1 比例 ) 406)取出位图 407)释放位图 418)释放匹配的DC 41绘制位图案例 41   8、Windows鼠标键盘消息 一、键盘消息 421、键盘消息 422、消息参数: 423、消息的使用: 424、键盘消息的案例代码 43二、鼠标消息 441、基本鼠标消息 442、双击消息 443、滚轮消息 454、不响应双击消息 45 9、Windows定时器消息 定时器消息介绍 47创建定时器 47关闭定时器 47定时器消息案例代码 4810、GDI游戏之跳舞动画 11、GDI游戏之走路动画 12、GDI贪吃蛇游戏实战  

110,539

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧