2010-04-16 5 views
-1

IImgCtx를 사용하여 이미지를로드하는 작업 코드가 있지만 알파 채널을 얻는 방법을 알아낼 수 없습니다. .gif 및 .png와 같은 이미지의 경우 투명 픽셀이 있지만 24 비트 비트 맵 이외의 다른 것을 드로잉 표면으로 사용하면 작동하지 않습니다. 인터페이스에 대한 참조를 들어 IImgCtx를 사용하여 알파 채널이있는 이미지를로드하려면 어떻게해야합니까?

: 내 코드는 다음과 같습니다 http://www.codeproject.com/KB/graphics/JianImgCtxDecoder.aspx

: "StartDC는"기본적으로 CreateCompatibleDC (NULL)와 "EndDC를"래핑

IImgCtx *Ctx = 0; 
HRESULT hr = CoCreateInstance(CLSID_IImgCtx, NULL, CLSCTX_INPROC_SERVER, IID_IImgCtx, (LPVOID*)&Ctx); 
if (SUCCEEDED(hr)) 
{ 
    GVariant Fn = Name; 
    hr = Ctx->Load(Fn.WStr(), 0); 
    if (SUCCEEDED(hr)) 
    { 
     SIZE Size = { -1, -1 }; 
     ULONG State = 0; 

     while (true) 
     { 
      hr = Ctx->GetStateInfo(&State, &Size, false); 
      if (SUCCEEDED(hr)) 
      { 
       if ((State & IMGLOAD_COMPLETE) || (State & IMGLOAD_STOPPED) || (State & IMGLOAD_ERROR)) 
       { 
        break; 
       } 
       else 
       { 
        Sleep(1); 
       } 
      } 
      else break; 
     } 

     if (Size.cx > 0 && 
      Size.cy > 0 && 
      pDC.Reset(new GMemDC)) 
     { 
      if (pDC->Create(Size.cx, Size.cy, 32)) 
      { 
       HDC hDC = pDC->StartDC(); 
       if (hDC) 
       { 
        RECT rc = { 0, 0, pDC->X(), pDC->Y() }; 
        Ctx->Draw(hDC, &rc); 
        pDC->EndDC(); 
       } 
      } 
      else pDC.Reset(); 
     } 
    } 

    Ctx->Release(); 

가 적절한 SelectObjects으로, DeleteDC를 래핑 HBITMAPS 등. 그리고 pDC-> Create (x, y, bit_depth)는 CreateDIBSection (... DIB_RGB_COLORS ...)을 호출합니다. 따라서 24 비트/픽셀 비트 맵을 만들었지 만 표현할 알파가 없으면 32 비트/픽셀 비트 맵을 전달하면 RGB 색상 채널이 채워지고 알파 채널 0x00이 남습니다. 이미지를 완전히 불투명하게 설정하기 위해 0xff로 알파 채널을 OR 한 경우 24 bpp 옵션과 동일하게 보입니다. 이제이 인터페이스는 Internet Explorer에서 이미지를로드하는 데 사용되며 분명히 투명도를 지원하므로 인터페이스에서 알파 수준을 얻는 것이 가능하다고 생각합니다. 문제는 어떻게?

답변

1

GDI 알파 채널을 지원하지 않습니다 (나는 또한 다시 등 내 .gif 참고 로더의 libpng/libjpeg/호출 코드를 가을이). Draw 메서드가 PNG 및 GIF에 대해 호출 될 때 일부 내부 알파 혼합 메서드가 작동하고 DC에서 선택된 비트 맵의 ​​알파 채널을 건드리지 않으며 내부적으로 저장된 PNG \ GIF 이미지의 알파 채널 데이터 만 사용하여 색상 채널을 결합합니다.

32 비트 BMP의 경우 알파 블렌딩이 없으며 모든 비트가 DC로 복사됩니다. DC에서 선택한 비트 맵의 ​​비트 심도와 DC에서 그려지는 비트 맵의 ​​비트 심도가 일치하면 DC에서의 그림은 memcpy 호출과 같습니다. 그렇기 때문에 GDI가 알파 채널을 지원한다는 착각이들 때가 있지만 실제로는 바이트의 벙어리 복사이고 복사 된 알파 채널은 결과 이미지에 차이를 만들지 않습니다.

즉, 알파 채널 작업에는 GDI 또는이 라이브러리를 기반으로하는 라이브러리를 사용하지 마십시오. 출시 된 지 약 10 년이 지난 GDI +를 사용하면 거의 모든 Windows 컴퓨터에서 찾을 수 있습니다.

관련 문제