GDI + прозрачное растровое изображение в Windows 7 - PullRequest
2 голосов
/ 30 сентября 2019

У меня есть прозрачные PNG-файлы, встроенные в мое приложение. Я загружаю байты, предварительно умножаю альфа и использую CreateBitmap для создания HBITMAP:

HBITMAP hBitmap = CreateBitmap(width, height, 1, 32, bytes);

Обычно я использовал AlphaBlend для масштабирования и отрисовки этих изображений внутри приложения, и это работаетЧто ж. Однако я отмечаю, что при запуске приложения в сеансе RDP в Windows 7 изображения не отображаются. Я предполагаю, что это из-за уменьшенной глубины цвета (кажется, что это или 16 или 24-битный цвет). Я не могу воспроизвести это на Windows 10;поскольку мне кажется, что я не могу установить глубину цвета ниже 32 бит ...


Я прочитал, что GDI + является более современным графическим API, и я должен попытаться использовать его вместо обычного GDI. Я пишу код следующим образом:

    m_hDisplayBitmap = // the earlier created HBITMAP
    int srcDim = 64;
    int destDim = 32;

    // WM_PAINT
    // dc = BeginPaint(// etc...)

    Graphics g(dc);

    BITMAPINFO bmInfo = { 0 };
    bmInfo.bmiHeader.biSize = sizeof(bmInfo.bmiHeader);

    // Get the BITMAPINFO from the source HBITMAP
    GetDIBits(dc, m_hDisplayBitmap, 0, 0, nullptr, &bmInfo, DIB_RGB_COLORS);

    bmInfo.bmiHeader.biHeight = -bmInfo.bmiHeader.biHeight;
    bmInfo.bmiHeader.biCompression = BI_RGB;

    BYTE* lpPixels = new BYTE[bmInfo.bmiHeader.biSizeImage];

    // Get the bits from the source HBITMAP
    GetDIBits(dc, m_hDisplayBitmap, 0, bmInfo.bmiHeader.biHeight, (LPVOID) lpPixels, &bmInfo, DIB_RGB_COLORS);

    // Create a GDI+ bitmap from the source bits
    Gdiplus::Bitmap sourceBmp(bmInfo.bmiHeader.biWidth, sourceDim, bmInfo.bmiHeader.biWidth * (bmInfo.bmiHeader.biBitCount / 8), PixelFormat32bppPARGB, lpPixels);

    // Create a GDI+ bitmap of the destination dimensions, and draw the source into it
    Gdiplus::Bitmap* destBmp = new Gdiplus::Bitmap(destDim, destDim);
    Graphics gx(destBmp);
    gx.DrawImage(&sourceBmp, 0, 0);

    // Create a cached bitmap and draw to the screen
    Gdiplus::CachedBitmap m_cachedBitmap = new Gdiplus::CachedBitmap(destBmp, &g);
    Gdiplus::Status s = g.DrawCachedBitmap(m_cachedBitmap, 0, 0); // Status is `Ok`

    // Cleanup 

В Windows 10 мое растровое изображение отображается в ожидаемом размере с прозрачностью:

enter image description here

В Windows 7 с любыми настройками дисплея вместо этого появляется серый шарик:

enter image description here

Что я делаю не так?

...