C++/Win32: 如何从HBITMAP中获取阿尔法通道?

10

我有一个包含 alpha 通道数据的 HBITMAP。使用 ::AlphaBlend GDI 函数可以成功地将其渲染。

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

是否有办法检索 HBITMAP 中像素的 alpha 通道值?

我想要能够检测何时使用 ::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;
1个回答

6
使用GetDIBits。这样你就可以得到一个RGBQUAD数组,其中有一个alpha通道,紧挨着R、G和B分量。

谢谢!我刚刚找到了答案并打算回来更新问题。(真诚地) - mackenir

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接