5

HBITMAPポインターが与えられ、アプリケーションがコンソールアプリケーションである場合、hbitmapからイメージバイトを取得するにはどうすればよいですか。取得できないHDCなどのパラメータを必要とするGetDIBitsを使用してみました。

編集:ファイルからビットマップをロードします:

HBITMAP bm = 0; 
BITMAP Bitmap;
bm = (HBITMAP)LoadImage (0, TEXT("C:\\img1.bmp"), IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE);

HBITMAPを関数に渡し、処理された画像の別のHBITMAPを取得することを期待しています。

HBITMAP out1 = func(bm);

funcはどこにありますか:

HBITMAP func(HBITMAP im);

そして問題は、HBITMAPから画像バイトを取得する方法です。

4

5 に答える 5

12

最も簡単な方法は、 (または)を使用しないことです。これらの関数は、データをコピーするため、最悪です。 データを直接必要とする場合は、(DDBビットマップの場合)を使用するだけです。GetDIBitsGetBitmapBits

BITMAP bitmap;
GetObject(hBitmap, sizeof(bitmap), (LPVoid)&bitmap);

DIBビットマップの使用

DIBSECTION dib;
GetObject(hBitmap, sizeof(dib), (LPVOID)&dib);

GetObject情報、参照:http:
//msdn.microsoft.com/en-us/library/windows/desktop/dd144904%28v=vs.85%29.aspx

これにはデータのコピーが含まれないため、GetDIBitsに関連する複雑な問題を回避できます。http://msdn.microsoft.com/en-us/library/windows/desktop/dd144879%28v=vs.85%29を参照して
ください。 aspxEsp
。の難しさの説明のための下部のコメントGetDIBits

パレット情報は取得されないことに注意してください。ただし、ほとんどのビットビットは24ビットまたは32ビットであるため、ほとんどの場合、これはほとんど問題になりません。

于 2014-10-31T11:49:26.193 に答える
1

LoadImageを取得するために使用しているのでHBITMAP、それは確かにDIB(デバイスに依存しないビットマップ)です(DIBセクションと呼ばれます)。ただし、色情報はありません。

このMSDNHOWTOは、メモリDCへのDIBセクションを選択する方法を示しています。GetDIBColorTable次に、パレットを取得するために使用します。ただし、そこから、そのDCを使用GetDIBitsして、実行しようとしていたようにRGBビットマップ情報を取得できると思います。

その一般的な要点は次のとおりです。

// Create a memory DC and select the DIBSection into it
hMemDC = CreateCompatibleDC( NULL );
(HBITMAP)SelectObject( hMemDC, hBitmap );

GetDIBits(hMemDC, hBitmap, ...);

DCにあっSelectObjectたものへのハンドルを返すコードに注意してください。次に、を呼び出す前にそれを復元します。完全に必要かどうかはわかりませんが、彼らはそれを行います。わかりやすくするために、ここでは省略しました。DeleteDC

于 2013-01-08T05:33:47.443 に答える
1

私たちのために働いたのはこれです:GetDIBits正しいパレット(インデックスカラーの場合)がまだデバイスコンテキストで選択されている間に呼び出します。(パレットを選択しないと、色が文字化けします。)

しかし、私たちのユースケースでは、DIBセクションのパフォーマンスがはるかに優れていることがわかったので、それらもチェックしてベンチマークを行ってください。ただし、いくつかの落とし穴があります。Windowsはパレットを使用しないため、使用する前に呼び出す必要がありSetDIBColorTableました。ただし、デバイスコンテキストには、デバイスコンテキストに選択されて実現された1つのエントリ(黒のみ)のダミーパレットが必要でした。そうでない場合、Windowsはによって設定されたパレットも無視しSetDIBColorTableます。両方が存在する必要があります。存在しないと、色が文字化けしますSetDIBColorTableRealizePalette

于 2017-01-18T13:59:57.580 に答える
0

質問が編集されたので、新しい答えを見てください...

デバイスコンテキスト()へのハンドルなしでこれを行うことはできませんHDC。これはGetDIBitsHBITMAP

ビットマップへのハンドル。これは互換性のあるビットマップ(DDB)である必要があります。

DDBは、(DIBまたはデバイスに依存しないビットマップとは対照的に)デバイスに依存するビットマップです。つまり、次のことを意味します。

DDBにはカラー値が含まれていないことに注意してください。代わりに、色はデバイスに依存する形式です。

そのためGetDIBits、が必要HDCです。そうしないと、色情報を取得できません。

おそらく良い質問は、HBITMAP伴奏なしでどこで手に入れたのHDCかということです。


このビットマップをメモリに作成しようとしている場合は、最初に呼び出しCreateCompatibleDCて、デバイスと互換性のあるメモリ内DCを作成し、次にそのDCでCreateCompatibleBitmapを作成できます。次に、あなたはあなたが好きなように一緒に働くためにHBITMAPHDCを持っています。そうでなければ、あなたが何を指しているのかわからない場合、あなたはそれでHBITMAP何か役に立つことを期待することはできません。

于 2013-01-08T03:14:33.933 に答える
0

コンソールからでもGetBitmapBitsAPIを試すことができます。詳細はこちら: http: //msdn.microsoft.com/en-us/library/windows/desktop/dd144850%28v=vs.85%29.aspx

HBITMAPハンドルを渡すだけで、バイトを取得できます

于 2013-01-08T03:18:02.397 に答える