从HBITMAP转换到IWICBitmap

Convert from HBITMAP to IWICBitmap

本文关键字:IWICBitmap 转换 HBITMAP      更新时间:2023-10-16

我正试图将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.

也一定要检查CoInitializeCoCreateInstance返回的HRESULT(为了简洁,这里省略了)…

编辑:我现在在评论中看到这确实是你的问题。不过,我还是留下我的答案吧,以防别人和我一样马虎。