Как скрыть IWICBitmapSource в HBITMAP?


Легко создать IWICBitmap из HBITMAP с помощью метода CreateBitmapFromHBITMAP factory. Но как получить простой GDI bitmap от IWICBitmapSource?

2 2

2 ответа:

Непростительно, что нет способа преобразовать IWICBitmap в HBITMAP или получить его из IWICBitmapSource. Однако вы можете легко создать HBITMAP из пиксельного буфера, если формат совместим с тем, что ожидает CreateBitmap.

Предполагая 32-битное растровое изображение RGBA:

IWICBitmapSource *bitmap_source = some_func();

UINT width = 0, height = 0;
bitmap_source->GetSize(&width, &height);

std::vector<BYTE> buffer(width * height * 4);
bitmap_source->CopyPixels(0, width * 4, buffer.size(), buffer.data());

HBITMAP bitmap = CreateBitmap(width, height, 1, 32, buffer.data());

Нет никакой гарантии, что за кулисами IWICBitmapSource даже использует растровое изображение GDI. Вы можете получить доступ к необработанным битам с помощью метода IWICBitmap::Lock, но если вы хотите использовать растровое изображение с функциями GDI, я думаю, вам нужно будет создать растровое изображение GDI и скопировать биты в него самостоятельно.