【问题标题】:How to covert IWICBitmapSource to HBITMAP?如何将 IWICBitmapSource 转换为 HBITMAP?
【发布时间】:2013-07-10 06:23:23
【问题描述】:

使用CreateBitmapFromHBITMAP 工厂方法从 HBITMAP 生成 IWICBitmap 很容易。但是如何从 IWICBitmapSource 获取简单的 GDI 位图呢?

【问题讨论】:

    标签: c++ windows winapi wic


    【解决方案1】:

    不幸的是,没有办法将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());
    

    【讨论】:

    • 您能否通过在 CopyPixels 之前添加 WICConvertBitmapSource32bppPBGRA 格式的转换来改进您的答案?从我的测试应用程序中可以看出,它是 GDI 位图的本机
    【解决方案2】:

    无法保证在幕后IWICBitmapSource 甚至使用 GDI 位图。您可以使用IWICBitmap::Lock 方法访问原始位,但如果您想将位图与 GDI 函数一起使用,我认为您需要创建一个 GDI 位图并将位复制到其中。

    【讨论】:

    • 是否有一些库可以为所有可能的 IWICBitmapSource 像素格式自动执行此操作?
    • GDI+ 可能是您最好的选择。
    • 使用 WICConvertBitmapSource msdn.microsoft.com/en-us/library/ee719819.aspx 将图像数据转换为 GDI32 可以处理的格式,可能是 32bppBGR 或 PBGRA。
    • @VincentPovirk 您可以添加您的评论作为答案吗?我会检查它是否被接受,这是CopyPixels之前最简单的解决方案
    猜你喜欢
    • 2013-02-23
    • 2011-10-23
    • 2011-11-14
    • 2013-04-02
    • 1970-01-01
    • 2011-09-21
    • 1970-01-01
    • 1970-01-01
    • 2012-12-12
    相关资源
    最近更新 更多