2

ビットマップのような構造体を HDC に変換する方法は?

現在、c++、gdi で画像処理プログラムを書いています。

HDCを手に入れたら。次のコードで、gdi の HDC に好きなものを描画できます。

// HDC is handy.
HDC dc;
dc.DrawXXX       // I can draw using gdi method.
Graphics gr(dc); // now I can also draw on the dc using gdi+ method.

私のアプリケーションは FreeImage に基づいています。私はfipImageを作ります。( Bitmap のようなデータ構造体を使用)

ただし、fipWinImage で描画したい場合は、fipWinImage を Bitmap にコピーし、次に Bitmap で描画し、最後にビットマップを fipImage に再度変換する必要がありますが、これには時間とメモリが消費されます。

fipImage をビットマップに変換 -> ビットマップに描画 -> ビットマップを fipWinImage に変換

fipWinImage imagefip;
Bitmap* tempImg = new Bitmap(imagefip->GetWidth(), imagefip.GetHeigt(), PixelFormat24bppRGB); // memory comsuming is image is large
Graphics *pGr = Graphics::FromImage(tempImg);

HDC dc = pGr->GetHDC();

RECT rec;
rec.left = 0;
rec.top = 0;
rec.right = imagefip.GetWidth();
rec.bottom = imagefip.GetHeight();
fipImage.draw(dc, rec); // using stretchdibits()
pGr->ReleaseHDC(dc);

Graphics gr(tempImg);
HDC dc = gr.GetHDC();         // Get an Hdc, draw using gdi method
gr.ReleaseHDC(tempDC);     //
gr.drawXXX                            // Draw using gdi+ method.


fipWinImage fipImg;             // final result fipWinImage.
HBITMAP temp;
Color color;
tempImg->GetHBITMAP(color, &temp);
fipImg->copyFromBitmap(temp);

fipImage から直接 HDC を構築したいと考えています。fipWinImage に直接描画する方法を教えてください。

4

2 に答える 2

2

最初にいくつかの説明:

デバイス コンテキストは基本的に、前景色と背景色、ブラシ、フォント情報、物理的な描画面 (ビットマップ) などを記憶する構造です。

これは便利なことで、グラフィックス操作を次々と行うときに、これらすべてを指定し続ける必要がありません。この方法で、これらすべての設定をより簡単に渡すこともできます。DC の本当の意味はこれだけです。描画するサーフェスを含む、描画パラメーターのコレクションにすぎません。

「HDC」は、これらの構造体の 1 つへの単なるハンドル (参照) です。「ハンドル」であるため、window は構造体をメモリ内で移動して、ポインタが混乱することなく空き領域を管理できます。

使用しているライブラリのソース コードにアクセスできる場合は、fipWinImage::draw(...) メソッドを調べてください。StretchDIBits を使用している場合は、ある時点で生のビットマップ データを互換性のある形式にする必要があります。また、fipWinImage クラスが基になる BITMAP または DIB などをラップしている可能性もあります。

独自の HDC を取得するための最終ステップ...

ビットマップはデバイス コンテキストに "選択" され、一度に 1 つの DC にしか選択できません。fipWinImage から内部 HBITMAP を取得できる場合は、それを別の DC に選択できます (別の HC にまだ選択されていないと仮定します)。

DC を作成すると、Windows は自動的に 1x1 ビットマップを作成します (DC には常にビットマップが選択されている必要があるため)。新しいビットマップを選択すると、以前に選択したビットマップへのハンドルが返されます。作業が終わったら元に戻す必要があるため、しばらくお待ちください。

それが役立つことを願っています。

于 2010-02-04T05:35:20.743 に答える
0

FreeImage はわかりませんが、そこから実際のピクセル データ (DIB セクション) へのポインターを取得できれば、毎回データをコピーしなくても共有する HBITMAP を作成できます。

于 2009-07-23T03:47:22.297 に答える