Метод Bitmap :: FromFile возвращает NULL на x86 - PullRequest
4 голосов
/ 06 февраля 2012

У меня есть этот фрагмент кода, работающий на 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. Если кто-то сможет просветить меня, я буду благодарен.

Спасибо!

1 Ответ

9 голосов
/ 06 февраля 2012

Код, который вы предоставили, хорошо работает для меня.

Но когда я прокомментировал инициализацию GDI +, метод Bitmap::FromStream(pStream) всегда возвращает указатель NULL.

Делаете ли выесть инициализация GDI +?

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

Кстати, инициализация GDI +:

GdiplusShutdown(gdiplusToken);
...