从HBITMAP转换为IWICBitmap

时间:2013-03-15 13:07:46

标签: c++ visual-studio-2010 image bitmap wic

我正在尝试将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对象指针?

2 个答案:

答案 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.

另请务必检查HRESULTCoInitialize返回的CoCreateInstance(为简洁起见,此处省略)...

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