我已经将这段代码用于Windows 7 64位:它允许我将包含在Image
(std::string
)中的Base64EncodedImage
的表示形式转换为{ {1}}:
GdiPlus::Bitmap
但它在Windows 7 32位上失败,特别是在这一行:
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;
}
它总是返回bitmap = Bitmap::FromStream(pStream);
,但是我无法理解这是如何在x64上工作而不是在x86中工作。如果有人能够启发我,我将不胜感激。
谢谢!
答案 0 :(得分:9)
您提供的代码对我很有用。
但是当我评论GDI +初始化时,Bitmap::FromStream(pStream)
方法总是返回NULL
指针。
你有GDI +初始化吗?
GdiplusStartupInput gdiplusStartupInput;
ULONG_PTR gdiplusToken;
// Initialize GDI+.
GdiplusStartup(&gdiplusToken, &gdiplusStartupInput, NULL);
顺便说一句,GDI +未初始化:
GdiplusShutdown(gdiplusToken);