我有一个HBITMAP
包含alpha通道数据.我可以使用::AlphaBlend
GDI函数成功渲染它.
但是,当我调用::GetPixel
GDI函数时,我永远不会使用alpha组件返回值.文档确实说它返回像素的RGB值.
有没有办法检索一个像素的alpha通道值HBITMAP
?
我希望能够检测何时使用:: 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;
Roel.. 5
使用GetDIBits.这样你就得到了一个RGBQUAD数组,你可以猜到R,G和B组件旁边的alpha通道.
使用GetDIBits.这样你就得到了一个RGBQUAD数组,你可以猜到R,G和B组件旁边的alpha通道.