我已經這段代碼在Windows 7工作的64位:它可以讓我包含成std::string
(Base64EncodedImage
)的Image
的表示變換爲一個GdiPlus::Bitmap
:位圖:: FROMFILE方法返回NULL在x86
HRESULT hr;
using namespace Gdiplus;
std::string decodedImage = Base64EncodedImage;
DWORD imageSize = decodedImage.length();
HGLOBAL hMem = ::GlobalAlloc(GMEM_MOVEABLE, imageSize);
if (!hMem)
ErrorExit(TEXT("GlobalAlloc")); //http://msdn.microsoft.com/en-us/library/windows/desktop/ms682499(v=vs.85).aspx
LPVOID pImage = ::GlobalLock(hMem);
if (!pImage)
ErrorExit(TEXT("GlobalLock"));
CopyMemory(pImage, decodedImage.c_str(), imageSize);
IStream* pStream = NULL;
BitmapData* bitmapData = new BitmapData;
if (::CreateStreamOnHGlobal(hMem, FALSE, &pStream) != S_OK)
ErrorExit(TEXT("CreateStreamOnHGlobal"));
else
{
bitmap = Bitmap::FromStream(pStream); //FAILS on WIN32
if (!bitmap)
ErrorExit(TEXT("FromStream"));
RECT clientRect;
GetClientRect(hwnd, &clientRect);
bitmapClone = bitmap->Clone(0, 0, clientRect.right, clientRect.bottom, PixelFormatDontCare);
delete bitmap;
bitmap = NULL;
}
但它無法在Windows 7 32位,特別是在這條線:
bitmap = Bitmap::FromStream(pStream);
它總是返回NULL
,但我不能讓這怎麼工作在x64上而不是在86。如果有人能夠啓發我,我會很感激。
謝謝!
不是專家,但你不應該'它傳遞給'CreateStreamonHGlobal'之前GlobalUnlock'內存? [MSDN](http://msdn.microsoft.com/en-us/library/windows/desktop/aa378980 \(v = vs.85 \).aspx)說:「當你有內存句柄時避免調用對象的方法與GlobalLock鎖定在一起,這會導致方法調用失敗,無法預料。「 – user786653 2012-02-06 18:12:56
據我所知,我應該鎖定/ CreateStreamOnHGlobal/Unlock;我會盡力去做你說的。 – 2012-02-06 18:34:45
可能的重複http://stackoverflow.com/questions/2746855/how-can-i-create-an-image-in-gdi-from-a-base64-encoded-string-in-c – 2012-02-06 18:44:57