Нарисуйте 32-бит с альфа-каналом из ресурсов, используя Direct2D
У меня есть старое приложение MCF, которое отображает некоторые изображения (bmp 32-бит с информацией альфа-канала), предварительно умножив изображения и используя 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 ответ
Вам нужно будет сделать IStream из ресурса для передачи в IWICImagingFactory::CreateDecoderFromStream.
Поскольку ресурсы доступны в памяти (при условии, что модуль, который их содержит, загружен), самый простой способ сделать это - создать объект IWICStream с помощью IWICImagingFactory::CreateStream и инициализировать его с помощью IWICStream::InitializeFromMemory.
Чтобы получить размер ресурса и указатель на первый байт, используйте функции FindResource, LoadResource, LockResource и SizeofResource.
Если заголовок вашего растрового изображения использует BI_BITFIELDS для указания формата с альфа-данными, я считаю, что WIC будет уважать это. У меня нет опыта работы с Direct2D, поэтому я не могу сказать, нужно ли вам что-то делать, чтобы он использовал альфа-данные.
Если вы не можете использовать BI_BITFIELDS (или если это не работает), вы можете написать свою собственную реализацию IWICBitmapSource, которая оборачивает IWICBitmapSource фрейма. Вы должны быть в состоянии передать большинство вызовов непосредственно источнику фрейма и предоставить свой собственный метод GetPixelFormat, который возвращает реальный формат данных изображения. Кроме того, вы можете создать IWICBitmap в нужном формате, заблокировать растровое изображение и скопировать данные пикселей из источника кадра.