※ ChatGPTを利用し、要約された質問です(原文:GDIによるメモリ上からの画像データ読み込みに関して)
GDIによるメモリ上からの画像データ読み込みに関するエラーについて
このQ&Aのポイント
VC++/CLIの開発環境で、unsigned char型の配列からGdiplus::Bitmap型を作成する際に発生するエラーについて解説します。
画像データのバイト数を利用してメモリを確保し、配列からGdiplus::Bitmap型を作成するコードを実装しましたが、CopyMemory時にエラーが発生します。
同様の画像データ配列を使用して、System::Drawing::Bitmap型に格納した場合には正常に表示されることを確認していますが、メモリ関連の問題が原因でGdiplus::Bitmap型には正しく変換できません。
GDIによるメモリ上からの画像データ読み込みに関して
開発環境はVC++/CLIです。
アンマネージ型のCOMオブジェクトの扱いで困っております。
JPEGやPNGなどの画像データを保存したunsigned char型配列から、Gdiplus::Bitmap型を作ろうとしています。
unsigned int imagesize; // 画像のバイト数が格納されている
array<unsigned char>^ image = gcnew array<unsigned char>(imagesize); //画像のデータが格納されている
事前にこのようなデータを用意し、以下のように記述しました。
HGLOBAL hResourceBuffer = GlobalAlloc(GMEM_MOVEABLE , imagesize);
void* pResourceBuffer = GlobalLock(hResourceBuffer);
CopyMemory(pResourceBuffer, &image, imagesize);
IStream* pIStream = NULL;
CreateStreamOnHGlobal(hResourceBuffer, TRUE, &pIStream)
data->bmp = new Gdiplus::Bitmap(pIStream);
pIStream->Release();
GlobalUnlock(hResourceBuffer);
GlobalFree(hResourceBuffer);
しかしながら、上記のコードだと、CopyMemory時に「保護されたメモリに書き込もうとした」といったエラーが発生します。
Webで色々検索しましたが、全て似たような記述で動作していました。
何が問題なのでしょうか?
尚、上記と同様の画像データ配列を使って、System::Drawing::Bitmap型に格納したとき、画像が正常に表示されることを確認しております。
画像のバイト数に於いても取得したデータに間違いはなく、やはりメモリ関連の問題だと思うのですが…。
MemoryStream^ memst = gcnew MemoryStream(image);
Bitmap^ bmp = gcnew Bitmap(memst);
memst->Close();
Graphics^ im = pictureBox1->CreateGraphics();
im->DrawImage(bmp, 0, 0, 100, 100);
delete bmp;
お礼
マネージ型のポインタと、アンマネージ型のポインタの互換性は無いのですか…。 悩んでいたところを助けていただき、どうも有難う御座いました。