问题描述:
项目里一个控件,需要加载本地图片,单张第一次加载的时候可以的,但是重新选择其他图片,会出现图片显示异常的现象。
直接上图,图片部分显示不全了。
)
问题分析:
一开始怀疑现象是有个图片重复选择后显示是好的,其他某几个图很容易复现,就怀疑是图片问题,查了半天jpg图片完整性,发现图片也没什么区别,后面又查分辨率,在DrawImage()里修改分辨率为偶数了也不行。。。最后只能看代码了,发现是代码里自己清理GLOBAL内存了。其实之前有项目我遇到清理GLOBAL内存导致图片显示不全或者异常的问题。时间太久忘记了。还是记录一下吧。
知识附录:
1, 是Bitmap(RT_BITMAP)类型的图片无法加载, RT_BITMAP是预定义类型, 资源里面没有bmp文件的头, SizeofResource 的返回值要比图片文件少几个字节,因为少了这几个字节, 所以GDI+会返回invalid parameter错误。
2, 从IStream里面创建出来的Image对象会引用到堆里面的GLOBAL内存, 如果GLOBAL内存hBuffer被释放了, 创建的Image的内容就会被破坏,有时只能画出一小部分图片, 有时整个图片有大片的乱码,好像是编码失败的样子, 视当时的内存状况而定。
另外调用Image的Clone也没用,深层次想Clone不是真正的深拷贝,还是依赖那个GLOBAL内存的,如果那个内存被销毁了,Clone的图片也会异常。
只有在销毁或者析构的时候才能清理那个GLOBAL内存,否则会导致显示异常(不是100%出现,而是间歇性出现,但是肯定会出现)。
这是看到的demo,拷贝过来的,可以看看,注意看注释。
1 | ini复制代码 |
\
本文转载自: 掘金