这篇文章是我在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()
不会导致错误,但它不会产生图像。
是实例化新位图并复制像素数据和位图信息的唯一解决方案吗?