2012-03-12 3 views
1

이미지를 미리 곱하고 CDC::AlphaBlend 메서드를 사용하여 일부 이미지 (bmp 32 비트 및 알파 채널 정보)를 표시하는 레거시 MCF 응용 프로그램이 있습니다.Direct2D를 사용하는 리소스에서 알파 채널이있는 32 비트 그리기

Direct2D를 사용하여 몇 가지 새로운 그래픽을 소개하고 싶지만 모든 이미지를 PNG 또는 다른 형식으로 마이그레이션하고 싶지 않습니다.

파일에서 bmp 이미지를 그렸지만 리소스에서 이미지를 가져 오는 데 문제가있어서 표시되는 이미지에 알파 채널 정보가 사용되지 않습니다.

그래서 아무도 나를 도와 줄 수 없습니까?

m_pRenderTarget->DrawBitmap(
    m_pBitmap, 
    D2D1::RectF(0.0f, 0.0f, size.width, size.height) 
    ); 

답변

1

당신은에 전달할 자원에서있는 IStream을 확인해야합니다 :이 코드는 비트 맵을 그릴 것입니다

hr = pIWICFactory->CreateDecoderFromFilename( L"D:\\image.bmp", 
               NULL, 
               GENERIC_READ, 
               WICDecodeMetadataCacheOnDemand, 
               &pDecoder); 
if (SUCCEEDED(hr)) 
{ 
    // Create the initial frame. 
    hr = pDecoder->GetFrame(0, &pSource); 
} 

if (SUCCEEDED(hr)) 
{ 
    //create a Direct2D bitmap from the WIC bitmap. 
    hr = pRenderTarget->CreateBitmapFromWicBitmap(
     pSource, 
     NULL, 
     ppBitmap 
     ); 

} 

:

는 비트 맵을 만들 수있는 내 코드입니다 IWICImagingFactory :: CreateDecoderFromStream입니다.

자원이 메모리에 있으므로 (로드 된 모듈이로드 된 경우) 가장 쉬운 방법은 IWICImagingFactory :: CreateStream을 사용하여 IWICStream 객체를 만들고 IWICStream :: InitializeFromMemory를 사용하여 초기화하는 것입니다.

리소스의 크기와 첫 번째 바이트에 대한 포인터를 얻으려면 FindResource, LoadResource, LockResource 및 SizeofResource 함수를 사용하십시오.

비트 맵의 ​​헤더에 BI_BITFIELDS를 사용하여 알파 데이터 형식을 지정하는 경우 WIC에서이를 존중할 것입니다. Direct2D에 대한 경험이 없으므로 알파 데이터를 사용하기 위해 추가 작업이 필요하다고 말할 수는 없습니다.

BI_BITFIELDS를 사용할 수 없거나 작동하지 않는 경우 프레임의 IWICBitmapSource를 래핑하는 고유 한 IWICBitmapSource 구현을 작성할 수 있습니다. 대부분의 호출을 프레임 소스에 직접 전달하고 이미지 데이터의 실제 형식을 반환하는 고유 한 GetPixelFormat 메서드를 제공 할 수 있어야합니다. 또는 원하는 형식으로 IWICBitmap을 만들고 비트 맵을 잠그고 프레임 소스의 픽셀 데이터를 복사 할 수 있습니다.

+0

재생 해 주셔서 감사합니다. 가능한 한 빨리 시도해 보겠습니다 (조사보다 우선 순위가 높은 것들). 어쨌든 알파 채널의 문제는 파일에서 비트 맵을 열 때 "존경받는"것이 아닙니다 ... 그래서 스트림을 사용하여 열 때 그것이 될 것입니다. –