Нарисуйте 32-бит с альфа-каналом из ресурсов, используя Direct2D - PullRequest
1 голос
/ 12 марта 2012

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

Я хотел бы представить новую графику с использованием 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 Ответ

1 голос
/ 13 марта 2012

Вам потребуется создать IStream из ресурса для передачи в IWICImagingFactory :: CreateDecoderFromStream.

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

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

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

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

...