0

我正在尝试将 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”的对象。

编辑2:

在确认将 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 对象指针?

4

2 回答 2

1

本声明

IWICImagingFactory* pWicFactory = NULL;

是罪魁祸首。

您正在传递一个NULL指向该函数的指针,然后您尝试使用该函数,从而导致错误。

于 2013-03-15T13:12:37.403 回答
0

除了空指针问题之外,您可能忘记先调用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.

请注意,如果您将工厂指针保存在 a 中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返回的CoInitializeCoCreateInstance(为简洁起见,此处省略)...

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

于 2014-04-20T15:25:24.893 回答