win7(旗舰版)下,OleLoadPicture 加载内存中的图片(MagickGetImageBlob),返回值 0
昨天去三哥家,想把拍好的照片缩小一下,我用很久前写的一个软件进行缩小,然后进行一次效果预览,这个时候弹出:
Call OleLoadPicture Fail - loadPictureFromMW
奇怪,这个图片批量处理软件我一直在用,在 xp系统下从来没出现过这样的提示,为什么在 win7下无法正常进行图片的效果预览?
更让我接受不了的是,从来没有用户或朋友向我反应这个问题,难道他们都不用 win7?
今天下午问了一个朋友借了台win7的笔记本,通过一下午的测试,解决了这个问题。
之前的代码思路:
通过 PBYTE pData =MagickGetImageBlob(MagickWand *, size_t length) 获取一张图片在内存中的指针和长度。
if(CreateStreamOnHGlobal(pData, FALSE, &pstream) == S_OK) //将字节数组转换成 IStream*{ if(SUCCEEDED(OleLoadPicture(pstream, length, TRUE, &IID_IPicture, (void**)&pPic)))这个代码在 xp下运行一切正常,可以正常加载 pData 指向的图片数据。
但在 win7奇旗舰版下, OleLoadPicture(....) 返回值 < 0
搞了2个小时也没找到解决办法,这个时候我想起 OleLoadPicture 加载文件的时候先根据文件大小分配一个内存空间,然后加载文件到指定的内存空间:
HANDLE FileHandle;ULONG SizeH, SizeL, ReadCount;IStream *pstream = NULL;//IPicture *pPic = NULL;FileHandle = CreateFile(pFilePath,GENERIC_READ,FILE_SHARE_READ,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL, NULL);if(FileHandle == INVALID_HANDLE_VALUE)return;SizeL = GetFileSize(FileHandle, &SizeH);HGLOBAL pBuffer = GlobalAlloc(GMEM_MOVEABLE, SizeL);if(pBuffer == NULL){CloseHandle(FileHandle);return;}LPVOID pDes = GlobalLock(pBuffer);if(ReadFile(FileHandle, pDes, SizeL, &ReadCount, NULL) == 0){GlobalUnlock(pBuffer);CloseHandle(FileHandle);GlobalFree(pBuffer); //释放全局内存return;}GlobalUnlock(pBuffer);CloseHandle(FileHandle);if(CreateStreamOnHGlobal(pBuffer, TRUE, &pstream) != S_OK){GlobalFree(pBuffer); //释放全局内存return;}if(SUCCEEDED(OleLoadPicture(pstream, SizeL, TRUE, &IID_IPicture, (void**)&pPic))){
由于 pData是通过MagickGetImageBlob()获取的图片数据指针, 会不会是 OleLoadPicture 无法加载指向 pData的图片数据呢?
我就按照 OleLoadPicture 加载图片文件的方式,先根据图片大小(length)分配一个内存空间,然后使用 memcpy 将指向 pData的数据复制一份到 pBuffer中,然后使用 OleLoadPicture 加载 pBuffer的图片数据,这样竟然解决了在win7下的问题:
size_t length;PBYTE pData = MagickGetImageBlob(mw, &length); //从mw中读取完整的字节数组//printf("length:%d\n",length);//测试发现在 [windows 7旗舰版], CreateStreamOnHGlobal & OleLoadPicture 无法直接使用 pData,//经过各种尝试后,发现,可以申请一个临时的内存空间(pBuffer), 将 PData 复制一份到这个内存空间:pBuffer//然后使用 CreateStreamOnHGlobal & OleLoadPicture 处理 pBuffer 而不是 PDataHGLOBAL pBuffer = GlobalAlloc(GMEM_MOVEABLE, length); //开辟一个内存空间LPVOID pDes = GlobalLock(pBuffer); //锁定内存空间memcpy(pDes,pData,length); //将 pData 的内容复制一份到 pBufferGlobalUnlock(pBuffer); //解锁内存空间IStream *pstream = NULL;if(CreateStreamOnHGlobal(pBuffer, FALSE, &pstream) == S_OK) //将字节数组转换成 IStream*{if(SUCCEEDED(OleLoadPicture(pstream, length, TRUE, &IID_IPicture, (void**)&pPic)))
2013-06-03
转载于:https://www.cnblogs.com/personnel/p/4584898.html
总结
以上是生活随笔为你收集整理的win7(旗舰版)下,OleLoadPicture 加载内存中的图片(MagickGetImageBlob),返回值 0的全部内容,希望文章能够帮你解决所遇到的问题。
- 上一篇: JDK自带线程池介绍及使用环境
- 下一篇: 第一阶段冲刺报告(一)