2012-03-12 7 views
1

У меня есть устаревшее приложение MCF, которое отображает некоторые изображения (32-битные бит с информацией о альфа-канале) путем предварительного умножения изображений и использования метода CDC::AlphaBlend.Рисовать 32-бит с альфа-каналом из ресурсов с помощью Direct2D

Я хотел бы представить некоторые новые графики с помощью Direct2D, но я не хочу переносить все изображения в png или другие форматы.

Мне удалось нарисовать BMP-изображение из файла, но у меня возникли проблемы с получением изображения из ресурсов, а также отображаемое изображение не использует информацию о альфа-канале.

Так может кто-нибудь помочь мне с этим?

Это мой код для создания растрового изображения:

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.

Поскольку ресурсы доступны в памяти (при условии, что модуль, содержащий их, загружен), самый простой способ сделать это - создать объект IWICStream с использованием IWICImagingFactory :: CreateStream и инициализировать его с помощью IWICStream :: InitializeFromMemory.

Чтобы получить размер ресурса и указатель на первый байт, используйте функции FindResource, LoadResource, LockResource и SizeofResource.

Если заголовок растрового изображения использует BI_BITFIELDS для указания формата с альфа-данными, я считаю, что WIC будет его уважать. У меня нет опыта работы с Direct2D, поэтому я не могу сказать, нужно ли вам что-то делать, чтобы использовать альфа-данные.

Если вы не можете использовать BI_BITFIELDS (или если это не работает), вы можете написать свою собственную реализацию IWICBitmapSource, которая обертывает IWICBitmapSource фрейма. Вы должны иметь возможность передавать большинство вызовов непосредственно источнику фрейма и предоставлять свой собственный метод GetPixelFormat, который возвращает реальный формат ваших данных изображения. Кроме того, вы можете создать IWICBitmap с нужным вам форматом, заблокировать растровое изображение и скопировать в пиксельные данные из источника кадра.

+0

Благодарим вас за повтор. Я попробую как можно скорее (более приоритетные вещи, чем сейчас). В любом случае проблема с альфа-каналом теперь не «уважается», когда я открываю растровое изображение из файла ... поэтому я сомневаюсь, что это произойдет при открытии с использованием потока. –