日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 >

win7(旗舰版)下,OleLoadPicture 加载内存中的图片(MagickGetImageBlob),返回值 0

發布時間:2025/5/22 48 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。