2

こんにちは、親愛なる教祖と専門家のコーダーです。

私は初心者から始めるつもりはなく、画像プログラミングについてはあまり知りませんが、残念ながらそれらは事実です:(

解像度1392x1032のビットマップポインタ*ImageDataから画像を表示しようとしています。解像度またはサイズ627x474の領域でそれを描画しようとしています。

ただし、繰り返し試行してもうまくいかないようです。作成したビットマップ画像を*ImageDataの幅と高さから解像度または約627x474のサイズに変更すると機能します

さまざまなフォーラムやグーグルから可能なすべての解決策を試した後、私は本当にこれを解決する方法を知りません。

pDCはCDC*であり、memDCは以前のメソッドで初期化されたCDCです。ここで初期化されていないものはすべて、他のメソッドで初期化されました。

これが私のコードです。ルーク・スカイウォーカーに提供されたヨーダとオビ=ワンのガイダンスを私に提供してください。

void DemoControl::ShowImage( void *ImageData )
{


    int Width; //Width of Image From Camera
    int Height; //Height of Image From Camera

    int m_DisplayWidth = 627 ;//width of rectangle area to display
    int m_DisplayHeight = 474;//height of rectangle area to display

    GetImageSize( &Width, &Height ) ; //this will return Width = 1392, Height 1032

    CBitmap bitmap;

    bitmap.CreateBitmap(Width,Height,32,1,ImageData);

    CBitmap* pOldBitmap = memDC.SelectObject((CBitmap*)&bitmap);

    pDC->BitBlt(22, 24, 627, 474, &memDC, 0, 0, SRCCOPY);

    memDC.SelectObject((CBitmap*)pOldBitmap);

    ReleaseDC(pDC);

}

ここにいくつかの追加パーツがあります

流れがどうなるかを説明したほうがいいと思います。

(a)クラス(たとえばDemoTestingDlgクラス)は、以下のようにCDCを別のクラス(たとえばDemoControlクラス)に渡します。

m_Demo = new DemoControl ; 

m_Demo->Initialisation( this, this->GetDC() ) ; 

(b)DemoControlクラスで

bool DemoControl :: Initialisation(CDemoTestingDlg m_FormControl、CDC m_StaticDisplay){

          pDC = m_StaticDisplay ; 
          memDC.CreateCompatibleDC(pDC); 

}

pDCとmemDCは、ヘッダーにそのようなものがあります。

CDC* pDC ; CDC memDC; 

(c)画像がキャプチャされたとすると、画像ポインタはDemoTestingDlgクラスに渡され、その後、質問で作成したメソッドであるDemoControlClassのshowImageメソッドが呼び出されます。私はそれを正しくやっていますか?

注:同じサイズ(CDCとビットマップを意味します)であると言えば画像が表示されたので、CDCポインターが正しく渡されたという印象を受けました

4

2 に答える 2

1

StretchBltはあなたの友達です:)

編集:OK、どうやってpDCを入手しますか?関数はいつ呼び出されますか?OnPaintまたはDrawItemを形成しますか?

これは、オーバーライドされたCStaticでDrawItem呼び出しから実行するStretchBltです。

HDC hBitmapDC   = CreateCompatibleDC( pDrawItemStruct->hDC );

HBITMAP hBitmap = GetBitmap();
HGDIOBJ hOld    = SelectObject( hBitmapDC, (HGDIOBJ)hBitmap );

StretchBlt( pDrawItemStruct->hDC, pDrawItemStruct->rcItem.left, pDrawItemStruct->rcItem.top, pDrawItemStruct->rcItem.right, pDrawItemStruct->rcItem.bottom,
            hBitmapDC, 0, 0, 4, 4, SRCCOPY );

SelectObject( hBitmapDC, hOld );
DeleteObject( hBitmapDC );

MFCクラスを使用して4x4ビットマップをより大きなスペースに拡大することはありませんが、完全に機能します。私の推測では、WM_PAINT / WM_DRAWITEMに応答してそれを行っていないか、間違ったDCを使用していると思います。

編集して編集します。次に、OnPaintまたはDrawItem呼び出し内からDrawImageを呼び出しますか?

そのCDCをキャッシュせず、描画するたびにCDCを渡す方がよいと思いました。

于 2010-05-14T09:29:43.547 に答える
0

「ビットマップポインタから*解像度1392x1032のImageData」

いいえ、そうではありません。サイズは1392x1032です。解像度は、距離ごとの個別の視覚単位の量です。

とにかく、上で述べたように、あなたはより多くのコードを投稿する必要があります。少なくともOnPaint()を表示します。CPaintDCをどこでインスタンス化しますか?新しいプロジェクトを作成し、そこにすべてのコードを配置して、問題を示す最小限のテストセットを作成します。現在使用しているBitBlt()の代わりにStretchBlt()を使用すると、ほぼ正しい方向に進んでいるように見えます。

于 2010-05-14T15:52:57.290 に答える