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自带线程池介绍及使用环境
- 下一篇: 第一阶段冲刺报告(一)