2014-12-01 7 views
1

PARGB32 비트 맵을 만들려고합니다. 이것은 XP 이후의 메뉴 항목으로 완전히 작동하는 이미지를 생성하는 데 필요합니다.WIC '픽셀 복사'호출 후 사전 곱하기 전화

이 예제는 http://msdn.microsoft.com/en-us/library/bb757020.aspx?s=6 매우 흥미롭지 만 이전에는 OLE 인터페이스를 사용했던 적이 거의 없었습니다. 그러나 WIC와 OLE를 사용하는 코드 조각을 신중하게 연구 한 후에 어떻게 작동하는지 이해할 수있을 것입니다. 나를 혼란스럽게하는 것은 'David Hellerman'이라는 사용자의 의견입니다. 요약하면, 그는이 예제 함수가 완전하지 않다고 말합니다. 소스 아이콘에서 잠재적 인 알파 정보를 고려하지 않으며 알파 데이터가있는 경우 ppvBuffer 변수를 스캔하면서 픽셀 단위로 미리 곱해야합니다.

제 질문은 두 부분으로 구성되어 있습니다. GDI 대신 WIC를 사용하는 동안 아이콘의 알파 데이터 존재를 어떻게 감지합니까? 픽셀이있을 경우 픽셀에 사전 곱셈을 적용하려면 어떻게해야합니까?

답변

2

기술적으로 샘플 코드는 CopyPixels를 호출 할 때 IWICBitmap 개체의 형식을 고려하거나 검사하지 않기 때문에 잘못되었습니다. 비트 맵을 만들 때 CreateBitmapFromHICON은 항상 특정 형식을 사용합니다 (해당 샘플은 32 비트 PBGRA를 제안하지만 주석은 BGRA를 제안 함). MSDN에서 문서화하지 않았으므로 최소한 나쁜 형식입니다. WIC는 많은 픽셀 형식을 지원하며 모두가 32 비트 또는 RGB가 아닙니다.

당신은 알려진 특정 형식으로 데이터를 변환 할 WICConvertBitmapSource 기능 (http://msdn.microsoft.com/en-us/library/windows/desktop/ee719819(v=vs.85).aspx)를 사용할 수 있습니다, 귀하의 경우에 당신은 아마 PARGB으로 기록 된 형식을 보는 데 사용하고 (GUID_WICPixelFormat32bppPBGRA을 할 것입니다,하지만 WIC는 사용 32 비트 정수가 아닌 바이트 배열의 구성 요소 순서에 기반한 이상한 명명 규칙). 변환이 데이터를 사전 처리하는 것을 의미한다면, 그렇게 할 것입니다. 그러나 요점은 특정한 포맷을 원한다면 거기에 도달하는 방법에 대해 걱정할 필요가 없다는 것입니다. MSDN 샘플에서 IWICBitmap을 사용하는 것과 같은 방법으로 결과 IWICBitmapSource를 사용할 수 있습니다.

IWICBitmapSource :: GetPixelFormat (http://msdn.microsoft.com/en-us/library/windows/desktop/ee690181(v=vs.85).aspx)을 사용하여 이미지의 픽셀 형식을 결정할 수 있습니다. 그러나 알파 데이터 (형식에 알파 데이터가있는 경우)가 미리 곱셈되었는지 여부를 일반적으로 알 수있는 방법이 없으므로 형식 GUID 만 인식하면됩니다. 일반적으로 두 개 이상의 형식을 처리하려고 할 때 일반적으로 GetPixelFormat을 사용하지만 처리 할 수없는 형식의 WICConvertBitmapSource는 다시 사용합니다.

편집 : 질문 중 일부를 놓쳤습니다. WIC는 모든 경우에 아이콘에서 알파 채널이있는 비트 맵을 만들기 때문에 아이콘에 원래 알파 채널이 있는지 여부를 IWICBitmap을 기반으로 감지 할 수 없습니다. 알파를 미리 곱하기는이 경우 no-op이기 때문에 또한 필요하지 않습니다.

+0

훌륭한 답변으로 @ Vincent와이 COM 물건 사용에 대한 새로운 아이디어를 제공합니다. 완전히 새로운 것입니다! 게다가 나는 WIC 코드가 잘못되었다고 말하는 MSN 페이지의 갈라진 틈이 실제로 잘못되었다고 생각합니다! 만약 그가 페이지를 더 읽었다면'Initialize' 멤버 함수가 작동 예제에서 사용되는 것을 보았을 것입니다. 이것은 당신이'IWICConvertBitmapSource' 함수를 통해 제안한 것과 같은 일을합니다. 내가 맞습니까? –

+1

허, 그들이 코드를 두 번 작성한 것처럼 보이고 두 번째로 (AddIconToMenuItem에서) 코드가 더 가깝습니다. (질문에 대답 할 때 보았던 모든 것) 잘못된 것입니다. 예, 그들은 제가 제안한 바를 정확히했습니다. –