У меня есть прозрачные 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 мое растровое изображение отображается в ожидаемом размере с прозрачностью:
В Windows 7 с любыми настройками дисплея вместо этого появляется серый шарик:
Что я делаю не так?