我正在尝试将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:
在确认将pWicFactory设置为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对象指针?
答案 0 :(得分:1)
此声明
IWICImagingFactory* pWicFactory = NULL;
是罪魁祸首。
您正在将NULL
指针传递给该函数,然后尝试使用该函数,从而导致错误。
答案 1 :(得分:0)
除了nullpointer问题,您可能忘记先调用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.
另请务必检查HRESULT
和CoInitialize
返回的CoCreateInstance
(为简洁起见,此处省略)...
编辑:我现在在评论中看到这确实是你的问题。我会留下我的答案,以防其他人像我一样邋.. ...