[英]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.
還要確保檢查由CoInitialize
和CoCreateInstance
返回的HRESULT
(為簡便起見,在此省略)...
編輯:我現在在評論中看到這確實是您的問題。 不過,如果其他人像我一樣草率,我會留下我的答案。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.