2010-05-27 7 views
1

저는 R, G, B 컬러 채널을 가진 24 비트 비트 맵과 R, G, B 알파 채널을 가진 24 비트 비트 맵을 가지고 있습니다. 첫 번째 비트 맵을 GDI의 HDC 또는 Direct2D의 RenderTarget에 각각 알파 채널로 알파 블렌드하고 싶습니다. 예를 들어 비트 맵 색상이 (192, 192, 192)이고 HDC 색상이 (0, 255, 255)이고 알파 채널이 (30, 40, 50) 인 경우 한 픽셀을 가정합니다. 최종 HDC 색상은 (22, 245, 242)이어야합니다. HDB를 메모리 HDC로 BitBlt 할 수 있다는 것을 알고 있습니다. 수동으로 각 픽셀의 색상을 계산하고 마지막으로 BitBlt를 다시 계산하여 알파 블렌딩을 수행합니다. 나는 단지 blitting을 피하고 API가 그들의 일을 수행하도록하고 싶다. (커널 공간에 있기 때문에 더 빠르다.)GDI에서 픽셀 단위의 알파 블렌딩

첫 번째 아이디어는 소스 비트 맵을 3 개의 빨간색 전용, 녹색 전용 및 파란색 전용 8 비트 비트 맵으로 분할하고 일반 알파 블렌딩을 수행 한 다음 3 개의 출력 비트 맵을 HDC로 합성하는 것입니다. 그러나 나는 Windows에서 분할과 컴포지션을 수행하는 방법을 찾지 못했습니다 (Direct2D 레이어 도움이 될까요?). 또한 분할 및 합성에는 많은 추가 복사가 필요할 수 있습니다. 성능 오버 헤드가 너무 높습니다.

또는 3 단계에서 알파 블렌딩을 수행 할 수도 있습니다. 각 패스는 하나의 채널에 대해 혼합을 적용하고 다른 채널은 변경하지 않고 유지합니다.

모든 의견을 주셔서 감사합니다.

편집 : 나는이 question을 발견 했으므로이 문제에 대한 대답이 도움이 될 것입니다. 그러나 AC_SRC_OVER 외에도 다른 블렌딩 작업이 지원되지 않습니다. Microsoft가 API를 개선하지 않는 이유는 무엇입니까?

답변

1

Windows 또는 OSX의 표준 라이브러리에서는 채널 별 알파가 지원되지 않습니다. 독립적으로 3 개의 레이어로 작업하고 (각 레이어를 별도의 32 비트 비트 맵으로 처리) 컴포지션 작성을 원할 수 있습니다.

+0

감사합니다. 이미 3 개의 알파 블렌딩을하는 것은 비용이 많이 들지만 실제 문제는 각 채널로 비트 맵을 작성하는 방법입니다. DIBSection을 사용자 정의하는 것이 더 쉬울 수도 있습니다. AlphaBlend에 더 많은 작업 유형이있는 경우에만 ... –