我已经在64位Windows 7上运行了这段代码:它使我可以将包含在Image(std::string)中的Base64EncodedImage的表示形式转换为GdiPlus::Bitmap:

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上是如何工作的,但在x86上却不行。如果有人能启发我,我将不胜感激。

谢谢!

最佳答案

您提供的代码对我来说效果很好。

但是,当我评论GDI +初始化时,Bitmap::FromStream(pStream)方法始终返回NULL指针。

您有GDI +初始化吗?

GdiplusStartupInput gdiplusStartupInput;
ULONG_PTR gdiplusToken;
// Initialize GDI+.
GdiplusStartup(&gdiplusToken, &gdiplusStartupInput, NULL);

顺便说一下,GDI +未初始化:
GdiplusShutdown(gdiplusToken);

关于c++ - Bitmap::FromFile方法在x86上返回NULL,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/9163372/

10-13 23:15