メモリ、GDI +から画像を読み込む
質問
簡単で簡単な質問です。C++のGDI +を使用して、メモリ内のピクセルデータから画像を読み込むにはどうすればよいですか。
解決
おそらく望んでいたほど簡単ではありませんが、ピクセルデータを使用してBMPファイルをメモリ内に作成できます。
必要に応じて、ピクセルデータをBITMAPに適した形式に変換します。たとえば、24ビットのRGBピクセルデータが既にある場合は、変換の必要はない可能性があります。
(メモリ内に)BITMAPFILEHEADER構造体を作成し、続いてBITMAPINFO構造体を作成します。
必要なものが揃ったら、GDI +が理解できるようにIStreamに入れる必要があります。おそらくこれを行う最も簡単な(ほとんどのパフォーマンスはありませんが)方法は次のとおりです。
- BITMAPFILEHEADER、BITMAPINFO、およびピクセルデータのサイズでGlobalAlloc()を呼び出します。
- 順番に、BITMAPFILEHEADER、BITMAPINFO、ピクセルデータを新しいメモリにコピーします(GlobalLockを呼び出して新しいメモリポインタを取得します)。
- 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)ファイル。メモリから画像をロードする場合も同様です。