gpt4 book ai didi

C++/Win32 : How to get the alpha channel from an HBITMAP?

转载 作者:可可西里 更新时间:2023-11-01 12:43:54 29 4
gpt4 key购买 nike

我有一个包含 alpha channel 数据的 HBITMAP。我可以使用 ::AlphaBlend GDI 函数成功渲染它。

但是,当我调用 ::GetPixel GDI 函数时,我从来没有取回带有 alpha 分量的值。文档确实说它返回像素的 RGB 值。

有没有办法检索 HBITMAP 中像素的 alpha channel 值?

我希望能够检测何时使用::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);

回答

使用 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;

最佳答案

使用 GetDIBits。这样你就得到了一个 RGBQUAD 数组,你可能猜到在 R、G 和 B 分量旁边有一个 alpha channel 。

关于C++/Win32 : How to get the alpha channel from an HBITMAP?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/333559/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com