windows C++/Win32:如何从 HBITMAP 获取 alpha 通道?
声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow
原文地址: http://stackoverflow.com/questions/333559/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me):
StackOverFlow
C++/Win32: How to get the alpha channel from an HBITMAP?
提问by mackenir
I have an HBITMAP
containing alpha channel data. I can successfully render this using the ::AlphaBlend
GDI function.
我有一个HBITMAP
包含 alpha 通道数据。我可以使用::AlphaBlend
GDI 函数成功渲染它。
However, when I call the ::GetPixel
GDI function, I never get back values with an alpha component. The documentation does say that it returns the RGB value of the pixel.
但是,当我调用::GetPixel
GDI 函数时,我永远不会返回带有 alpha 组件的值。文档确实说它返回像素的 RGB 值。
Is there a way to retrieve the alpha channel values for pixels in an HBITMAP
?
有没有办法检索 中像素的 alpha 通道值HBITMAP
?
I want to be able to detect when to use ::AlphaBlend, and when to use an old-school method for treating a particular colour in the source HBITMAP as transparent.
我希望能够检测何时使用 ::AlphaBlend,以及何时使用老式方法将源 HBITMAP 中的特定颜色视为透明。
HDC sourceHdc = ::CreateCompatibleDC(hdcDraw);
::SelectObject(sourceHdc, m_hbmp);
// This pixel has partial transparency, but ::GetPixel returns just RGB.
COLORREF c = ::GetPixel(sourceHdc, 20, 20);
// Draw the bitmap to hdcDraw
BLENDFUNCTION bf1;
bf1.BlendOp = AC_SRC_OVER;
bf1.BlendFlags = 0;
bf1.SourceConstantAlpha = 0xff;
bf1.AlphaFormat = AC_SRC_ALPHA;
::AlphaBlend(di.hdcDraw, x, 10, 64, 64, sourceHdc, 0, 0, 64, 64, bf1);
::DeleteDC(sourceHdc);
Answer
回答
Use GetDIBits to retrieve the first (or more) scan line(s) of the image:
使用 GetDIBits 检索图像的第一个(或多个)扫描线:
byte* bits[1000];// = new byte[w * 4];
BITMAPINFO bmi;
memset(&bmi, 0, sizeof(BITMAPINFO));
bmi.bmiHeader.biSize = sizeof(BITMAPINFOHEADER);
bmi.bmiHeader.biWidth = w;
bmi.bmiHeader.biHeight = -h;
bmi.bmiHeader.biBitCount = 32;
bmi.bmiHeader.biPlanes = 1;
bmi.bmiHeader.biCompression = BI_RGB;
bmi.bmiHeader.biSizeImage = 0;
bmi.bmiHeader.biXPelsPerMeter = 0;
bmi.bmiHeader.biYPelsPerMeter = 0;
bmi.bmiHeader.biClrUsed = 0;
bmi.bmiHeader.biClrImportant = 0;
int rv = ::GetDIBits(sourceHdc1, m_hbmp, 0, 1, (void**)&bits, &bmi, DIB_RGB_COLORS);
//bits[3] == alpha of topleft pixel;
//delete[] bits;
采纳答案by Roel
Use GetDIBits. That way you get an array of RGBQUAD's which have as you can probably guess an alpha channel next to the R, G and B components.
使用 GetDIBits。这样你就得到了一个 RGBQUAD 数组,你可以猜到 R、G 和 B 分量旁边的一个 alpha 通道。