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 オブジェクトを初期化する他の方法を見つけることができませんでした。

私の質問は 次のとおりです。新しい質問が以下に掲載されています。

編集: newpWicFactory を初期化するために使用しようとすると、次のメッセージが表示されます

エラー: 抽象クラス タイプ「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 オブジェクト ポインターを適切に初期化するにはどうすればよいですか?

4

2 に答える 2

1

この宣言

IWICImagingFactory* pWicFactory = NULL;

犯人です。

関数へのポインタを渡してNULLおり、それを使用しようとすると、エラーが発生します。

于 2013-03-15T13:12:37.403 に答える
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.

ファクトリ ポインタを 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また、返されたCoInitializeandを必ず確認してくださいCoCreateInstance(簡潔にするためにここでは省略します)...

編集:コメントで、これが実際にあなたの問題であることがわかりました。ただし、他の人が私のように目が悪い場合に備えて、答えを残します..

于 2014-04-20T15:25:24.893 に答える