首页 > 解决方案 > 如何从 windcodecs api IWICBitmapDecoder、IWICBitmap 或 IWICImagingFactory 获取 GDI 兼容位图?

问题描述

这篇文章是我在How to acquire instance of IWICImagingFactory in winapi-rs 中提到的问题的延续,最初是在How to pass a reference as a pointer of type of [sometype;1] in rust? .

现在我已经找到了一种使用 COM API 对存储在可执行文件中的 BMP 文件进行易出错的解析的方法,我尝试将它们与需要类型的 winGDI(尤其是SelectObject()和)一起使用。DeleteObject()HGDIOBJECT

搜索到与 GDI 兼容的位图的转换最终给我留下了这样的结果:

    let mut pFactory: *mut c_void = zeroed();
    let hr = CoCreateInstance(&CLSID_WICImagingFactory as *const IID,
                              null_mut(),
                              CLSCTX_INPROC,
                              &IWICImagingFactory::uuidof(),
                              &mut pFactory as *mut *mut c_void);
                        
    
    let mut pBmp: *mut IWICBitmap = zeroed();
    
    let hr = (pFactory as *mut _ as *mut IWICImagingFactory)
                             .as_ref()
                             .unwrap()
                             .CreateBitmapFromMemory(
                                 size.cx as u32,
                                 size.cy as u32,
                                 &GUID_WICPixelFormat24bppRGB,
                                 (buffer.len() as u32 / size.cy as u32),
                                 buffer.len() as u32,
                                 buffer.as_ptr(),
                                 &mut pBmp as *mut *mut IWICBitmap
                             );

由于我已经放弃了使用的想法,IStream并且CreateDecoderFromStream()由于看似前所未有的功能允许我从IWICBitmapDecoder.

我不肯定是否实现了这样的功能IWICBitmap,但是将其转换为HGDIOBJECT并按顺序使用 inSelectObject()不会导致错误,但它不会产生图像。

是实例化新位图并复制像素数据和位图信息的唯一解决方案吗?

标签: winapirustgdi

解决方案


推荐阅读