문제

나는있다 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 배열을 얻을 수 있습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top