質問

簡単で簡単な質問です。C++のGDI +を使用して、メモリ内のピクセルデータから画像を読み込むにはどうすればよいですか。

役に立ちましたか?

解決

おそらく望んでいたほど簡単ではありませんが、ピクセルデータを使用してBMPファイルをメモリ内に作成できます。

必要に応じて、ピクセルデータをBITMAPに適した形式に変換します。たとえば、24ビットのRGBピクセルデータが既にある場合は、変換の必要はない可能性があります。

(メモリ内に)BITMAPFILEHEADER構造体を作成し、続いてBITMAPINFO構造体を作成します。

必要なものが揃ったら、GDI +が理解できるようにIStreamに入れる必要があります。おそらくこれを行う最も簡単な(ほとんどのパフォーマンスはありませんが)方法は次のとおりです。

  1. BITMAPFILEHEADER、BITMAPINFO、およびピクセルデータのサイズでGlobalAlloc()を呼び出します。
  2. 順番に、BITMAPFILEHEADER、BITMAPINFO、ピクセルデータを新しいメモリにコピーします(GlobalLockを呼び出して新しいメモリポインタを取得します)。
  3. CreateStreamOnHGlobal()を呼び出して、メモリ内BMPのIStreamを取得します。

今、GDI + Image :: FromStream()メソッドを呼び出して、画像をGDI +にロードします。

がんばって!

他のヒント

BITMAPINFOとピクセルデータへのポインターを直接受け取るビットマップコンストラクターがあります。例:

BITMAPINFO bmi;
memset(&bmi, 0, sizeof(bmi));
bmi.bmiHeader.biSize = sizeof(BITMAPINFOHEADER);
bmi.bmiHeader.biWidth = 32;
bmi.bmiHeader.biHeight = 32;
bmi.bmiHeader.biPlanes = 1;
bmi.bmiHeader.biCompression = BI_RGB;
bmi.bmiHeader.biBitCount = 24;
char data[32 * 32 * 3];
// Write pixels to 'data' however you want...
Gdiplus::Bitmap* myImage = new Gdiplus::Bitmap(&bmi, data);

RGB画像の場合は問題ありません。パレット画像の場合は、RGBQUADSなどに十分なスペースのあるBITMAPINFOを割り当てる必要があります。

SHCreateMemStreamを使用して、データへのポインタとデータのサイズを取得します。

IStream *pStream = SHCreateMemStream((BYTE *) InputBuffer, Size);
// Do what you want
pStream->Release();

「メモリ内のピクセルデータ」は特定の画像タイプ、つまりビットマップ、TIF、PNGなどとしてフォーマットされていますか?その場合は、ストリームに入れてSystem.Drawing.Image.FromStreamを使用します。

この記事では、GDI +画像をどのようにロードできるかを説明しています。リソース(rc)ファイル。メモリから画像をロードする場合も同様です。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top