簡體   English   中英

從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”的對象。

編輯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對象指針?

這個宣言

IWICImagingFactory* pWicFactory = NULL;

是罪魁禍首。

您正在將NULL指針傳遞給該函數,然后嘗試使用該指針,從而導致錯誤。

除了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.

還要確保檢查由CoInitializeCoCreateInstance返回的HRESULT (為簡便起見,在此省略)...

編輯:我現在在評論中看到這確實是您的問題。 不過,如果其他人像我一樣草率,我會留下我的答案。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM