2012-03-12 36 views
1

資源繪製32位的alpha通道我有乘以預先的圖像,並使用CDC::AlphaBlend方法顯示某些圖像(BMP的alpha通道信息32位)的遺留應用MCF。使用的Direct2D

我想向大家介紹使用Direct2D的一些新的圖形,但我不希望遷移的所有圖像,PNG等格式。

我設法從文件中得出一個BMP圖像,但我面臨的問題,以獲得從資源圖像,並顯示圖像不使用alpha通道信息。

所以可能有人幫助我嗎?

這是我的代碼來創建位圖:

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 
     ); 

} 

這是代碼繪製位圖:

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

回答

1

你需要從資源做出一個IStream傳遞給IWICImagingFactory :: CreateDecoderFromStream。

由於資源在內存中可用(假設包含它們的模塊已加載),最簡單的方法是使用IWICImagingFactory :: CreateStream創建IWICStream對象並使用IWICStream :: InitializeFromMemory對其進行初始化。

獲取資源的大小和指針的第一個字節,使用FindResource,LoadResource,LockResource和SizeofResource功能。

如果您的位圖的標題上使用BI_BITFIELDS指定與阿爾法數據的格式,我相信會WIC尊重。我對Direct2D沒有任何經驗,所以我不能說你是否需要做進一步的工作才能使用alpha數據。

如果你不能使用BI_BITFIELDS(或者如果不行),你可以編寫你自己的IWICBitmapSource實現來包裝框架的IWICBitmapSource。您應該能夠將大部分調用直接傳遞給框架源,並提供您自己的GetPixelFormat方法,該方法將返回圖像數據的實際格式。或者,您可以使用所需的格式創建IWICBitmap,鎖定位圖並從幀源中複製像素數據。

+0

謝謝您的重播。我會盡快嘗試(比現在調查更優先考慮的事情)。無論如何,現在當我從文件中打開位圖時,alpha通道的問題並沒有被「尊重」......所以我懷疑它是在打開使用流的時候。 – 2012-03-16 08:10:58