从HBITMAP转换到IWICBitmap
Convert from HBITMAP to IWICBitmap
我正试图将HBITMAP转换为IWICBitmap,并且我遇到了相当多的麻烦。我找到了函数:
CreateBitmapFromHBITMAP();
但是我不能让它工作。下面是我如何使用它的:
void camera_avtcam_ex_t::GrabAsyncFrame(ULONG frameId, IWICImagingFactory* pWicFactory, IWICBitmap** outputBitmap, bool* pAbort )
{
QueueCamFrame();
HBITMAP transferbitmap;
GetFeatureAndRunAcquisitionStart(transferbitmap); //returns transferbitmap
//as a valid HBITMAP
//This HBITMAP works, I can save it to a file and/or print
//it to the screen and the image is displayed properly
pWicFactory->CreateBitmapFromHBITMAP(transferbitmap, NULL, WICBitmapUseAlpha, outputBitmap);
}
执行函数中的最后一行代码会导致访问冲突错误。
在调用GrabAsyncFrame()
函数之前,我创建了它所需的参数,如下所示:
ULONG frameId = 0;
IWICImagingFactory* pWicFactory = NULL;
IWICBitmap** outputBitmap = new IWICBitmap*;
bool* pAbort = NULL;
theCamera.GrabAsyncFrame(frameId, pWicFactory, outputBitmap, pAbort);
我有点怀疑将pWicFactory设置为NULL,然后很快使用它。但是我想不出任何其他方法来初始化IWICImagingFactory对象。
所以我的问题是:新问题张贴在下面。
编辑:如果我尝试使用new
初始化pWicFactory,我得到一个消息说
错误:不允许抽象类类型为"IWICImagingFactory"的对象。
EDIT2:
确认将pwicimagingfactory设置为NULL是问题后,我现在需要知道如何正确初始化IWICImagingFactory对象指针。这是我现在正在处理的:
ULONG frameId = 0;
IWICImagingFactory* pWicFactory = NULL;
/*new code*/CoCreateInstance(CLSID_WICImagingFactory, NULL, CLSCTX_INPROC_SERVER, IID_PPV_ARGS(&pWicFactory));
IWICBitmap** outputBitmap = new IWICBitmap*;
bool* pAbort = NULL;
theCamera.GrabAsyncFrame(frameId, pWicFactory, outputBitmap, pAbort);
问题:我如何正确初始化IWICImagingFactory对象指针?
此声明
IWICImagingFactory* pWicFactory = NULL;
是罪魁祸首。
你正在传递一个NULL
指针到函数,然后你试图使用它,导致错误。
除了空指针问题,您可能忘记先调用CoInitialize
:
IWICImagingFactory* Factory;
…
CoInitializeEx(NULL, COINIT_MULTITHREADED); // do this during program init / before CoCreateInstance
CoCreateInstance(CLSID_WICImagingFactory, nullptr, CLSCTX_INPROC_SERVER, IID_PPV_ARGS(&Factory));
// use factory..
CoUninitialize(); // do this before program exit.
请注意,如果您将工厂指针保存在ComPtr
中(我建议这样做),则需要在取消初始化之前释放工厂接口。在这种情况下,你应该这样做:
ComPtr<IWICImagingFactory> Factory;
…
CoInitializeEx(NULL, COINIT_MULTITHREADED); // do this during program init / before CoCreateInstance
CoCreateInstance(CLSID_WICImagingFactory, nullptr, CLSCTX_INPROC_SERVER, IID_PPV_ARGS(&Factory));
// use factory..
Factory.Reset(); // do this before CoUninitialize
CoUninitialize(); // do this before program exit.
也一定要检查CoInitialize
和CoCreateInstance
返回的HRESULT
(为了简洁,这里省略了)…
编辑:我现在在评论中看到这确实是你的问题。不过,我还是留下我的答案吧,以防别人和我一样马虎。
相关文章:
- 防止主数据类型C++的隐式转换
- 模板参数替换失败,并且未完成隐式转换
- 努力将整数转换为链表。不知道我在这里做错了什么
- HEX值到wchar_t字符(UTF-8)的转换
- lambda参数转换为constexpr技巧,然后获取带链接的数组
- 将 Qvector<uint8_t> 转换为 QString
- 如何在cuSparse中使用cusparseXcoo2csr从coo转换为csc
- 有关插入适配器的错误。[错误]请求从 'back_insert_iterator<vector<>>' 类型转换为非标量类型
- 在c++中使用nlohmann从类到json的转换
- 从"int*"强制转换为"unsigned int"会丢失精度错误
- 将Integer转换为4字节的unsined字符矢量(按大端字节顺序)
- 处理小于cpu数据总线的数据类型.(c++转换为机器代码)
- 如何使用OpenCV将RBG图像转换为HSV,并将H、S和V值保存为C++中的3个独立图像
- 复制列表初始化的隐式转换的等级是多少
- 正在将指针转换为范围
- 如何防止 c++ 在从浮点型转换为双精度型(不适用于 IO)时添加额外的小数?
- 将"打开的CV图像"中的"颜色"转换为整数格式
- 是否可以从int转换为enum类类型
- 了解 GLM- openGL 中的相机转换
- 从HBITMAP转换到IWICBitmap