使用StretchDIBits复制PNG(带alpha)

问题描述 投票:-2回答:1

有人能帮助我吗? 我如何将png复制到虚拟HDC。 透明像素始终为黑色。 我试过但是alpha总是黑的。 好像BITMAPINFOHEADER似乎不支持alpha。 非常感谢你。 抱歉我的英语和平。 (注意我只需要使用GDI)

// fill background
HBRUSH hbrush = CreateSolidBrush(RGB(color.red(), color.green(), color.blue()));
::FillRect(m_virtualHDC, &wRect, hbrush);
DeleteObject(hbrush);
// load image
QImage pix;
pix.load("D:\\1.png");
// draw image with alpha
BITMAPINFO bmInfo;
ZeroMemory(&bmInfo, sizeof(BITMAPINFO));
BITMAPINFOHEADER& BMPInfoHeader = bmInfo.bmiHeader;
BMPInfoHeader.biSize = sizeof(BITMAPINFOHEADER);
BMPInfoHeader.biWidth = pix.width();
BMPInfoHeader.biHeight = pix.height();
BMPInfoHeader.biPlanes = 1;
BMPInfoHeader.biBitCount = 32;
BMPInfoHeader.biCompression = BI_RGB;
BMPInfoHeader.biSizeImage = pix.byteCount();
BMPInfoHeader.biXPelsPerMeter = 0;
BMPInfoHeader.biYPelsPerMeter = 0;
BMPInfoHeader.biClrUsed = 0;
SetStretchBltMode(m_virtualHDC, HALFTONE);
StretchDIBits(m_virtualHDC,
    targetRect.x(), targetRect.y(), targetRect.width(), targetRect.height(),
    sourceRect.x(), sourceRect.y(), sourceRect.width(), sourceRect.height(),
    pix.bits(), &bmInfo, DIB_RGB_COLORS, SRCCOPY);
c++ windows winapi
1个回答
2
投票

GDI通常不支持alpha通道。

您需要使用具有专用alpha支持的API,例如: G。 AlphaBlend()GDI+

大多数这些API的重采样质量非常差。我建议使用像stb_image_resize这样的第三方库在内存中重新采样,并使用像AlphaBlend()这样的API来显示屏幕的最终结果,而不进行进一步的缩放。

© www.soinside.com 2019 - 2024. All rights reserved.