C ++/Win32 : HBITMAP에서 알파 채널을 얻는 방법은 무엇입니까?
문제
나는있다 HBITMAP
알파 채널 데이터를 포함합니다. 나는 이것을 사용하여 이것을 성공적으로 렌더링 할 수 있습니다 ::AlphaBlend
GDI 기능.
그러나 내가 전화 할 때 ::GetPixel
GDI 함수, 나는 알파 구성 요소로 값을 되찾지 않습니다. 문서는 픽셀의 RGB 값을 반환한다고 말합니다.
픽셀의 알파 채널 값을 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;
해결책
getDibits를 사용하십시오. 이렇게하면 R, G 및 B 구성 요소 옆에있는 알파 채널을 추측 할 수있는 RGBQUAD 배열을 얻을 수 있습니다.
제휴하지 않습니다 StackOverflow