【发布时间】:2012-01-02 01:55:12
【问题描述】:
我正在尝试为 hbitmap 对象添加透明度,但它从不绘制任何东西:/
这是我用来绘制手柄的代码
HDC hdcMem = CreateCompatibleDC(hDC);
HBITMAP hbmOld = (HBITMAP) SelectObject(hdcMem, m_hBitmap);
BLENDFUNCTION blender = {AC_SRC_OVER, 0, (int) (2.55 * 100), AC_SRC_ALPHA}; // blend function combines opacity and pixel based transparency
AlphaBlend(hDC, x, y, rect.right - rect.left, rect.bottom - rect.top, hdcMem, rect.left, rect.top, rect.right - rect.left, rect.bottom - rect.top, blender);
SelectObject(hdcMem, hbmOld);
DeleteDC(hdcMem);
这是应该向 hbitmap 添加 alpha 通道的代码
BITMAPINFOHEADER bminfoheader;
::ZeroMemory(&bminfoheader, sizeof(BITMAPINFOHEADER));
bminfoheader.biSize = sizeof(BITMAPINFOHEADER);
bminfoheader.biWidth = m_ResX;
bminfoheader.biHeight = m_ResY;
bminfoheader.biPlanes = 1;
bminfoheader.biBitCount = 32;
bminfoheader.biCompression = BI_RGB;
HDC windowDC = CreateCompatibleDC(0);
unsigned char* pPixels = new unsigned char[m_ResX * m_ResY * 4];
GetDIBits(windowDC, m_hBitmap, 0, m_ResY, pPixels, (BITMAPINFO*) &bminfoheader, DIB_RGB_COLORS); // load pixel info
// add alpha channel values of 255 for every pixel if bmp
for (int count = 0; count < m_ResX * m_ResY; count++)
{
pPixels[count * 4 + 3] = 255; <---- here i've tried to change the value to test different transparency, but it doesn't change anything
}
SetDIBits(windowDC, m_hBitmap, 0, GetHeight(), pPixels, (BITMAPINFO*) &bminfoheader, DIB_RGB_COLORS); // save the pixel info for later manipulation
DeleteDC(windowDC);
编辑:
这是我如何创建位图的代码 我稍后在一些代码中填写像素数据
m_hBuffer = CreateBitmap( m_ResX, m_ResY, 1, 32, nullptr );
【问题讨论】:
-
我认为您必须将 GDI+ 用于 Alpha 通道。较旧的 GDI 内容不适用于 32 位图像。见:stackoverflow.com/questions/3942781/…
-
@Mordachai - 大多数 GDI 功能都是如此 - 例如 BitBlt - 但 AlphaBlend(在 Win2K 中添加)被记录为专门支持源图像中的每像素 alpha。
-
@joeco,您是否尝试过大量调试以试图缩小问题所在?例如。首先尝试使用 BitBlt,只是为了确保其余的代码和逻辑是好的。还可以尝试更改 alpha 更改代码,以将所有 G 和 B 通道设置为与 R 通道相同 - 只是为了确保您的位图操作代码正常。顺便说一句,请注意 AlphaBlend 期望源位图 R/G/B 被“预乘”,因此如果您要添加 Alpha 通道,您可能也需要在该阶段适当地调整 R/G/B。跨度>
-
@BrendanMcK,我试过编辑像素的其他信息,但它确实什么也没做,有人知道为什么吗? :/ 注意:如果我更改
SourceConstantAlpha,那么我的图像确实会变得透明,但完全是 -
@joeco - 谜团解开了 - 我想;检查下面的可能答案!