【发布时间】:2013-07-10 06:23:23
【问题描述】:
使用CreateBitmapFromHBITMAP 工厂方法从 HBITMAP 生成 IWICBitmap 很容易。但是如何从 IWICBitmapSource 获取简单的 GDI 位图呢?
【问题讨论】:
使用CreateBitmapFromHBITMAP 工厂方法从 HBITMAP 生成 IWICBitmap 很容易。但是如何从 IWICBitmapSource 获取简单的 GDI 位图呢?
【问题讨论】:
不幸的是,没有办法将IWICBitmap 转换为HBITMAP,或者从IWICBitmapSource 中得到一个。但是,如果格式与 CreateBitmap 所期望的兼容,您可以轻松地从像素缓冲区创建 HBITMAP。
假设 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());
【讨论】:
WICConvertBitmapSource 到 32bppPBGRA 格式的转换来改进您的答案?从我的测试应用程序中可以看出,它是 GDI 位图的本机
无法保证在幕后IWICBitmapSource 甚至使用 GDI 位图。您可以使用IWICBitmap::Lock 方法访问原始位,但如果您想将位图与 GDI 函数一起使用,我认为您需要创建一个 GDI 位图并将位复制到其中。
【讨论】:
CopyPixels之前最简单的解决方案