wxPaintDC に 8 ビットのグレースケール画像データを描画したいのですが、うまくいきません。データは uint8_t 配列で利用できます。以下の動作しないコードを参照してください (これはいくつかの試みの 1 つです)。他の wxPaintDC::Draw* 関数を使用して描画できるので、他のすべてはうまく設定されていると思います。
uint8_t testBuffer[] =
{
250, 220, 222, 223, 210,
186, 22, 29, 89, 110,
250, 220, 222, 203, 210,
240, 120, 220, 123, 210,
230, 210, 252, 223, 210
};
wxBitmap cameraImage(5, 5, 8);
wxNativePixelData cameraImageData(cameraImage);
wxNativePixelData::Iterator p(cameraImageData);
for(unsigned y = 0; y < 5; ++y)
{
wxNativePixelData::Iterator rowStart = p;
for(unsigned x = 0; x < 5; ++x, ++p)
{
uint8_t value = testBuffer[5 * y + x];
p.Red() = value;
p.Green() = value;
p.Blue() = value;
}
p = rowStart;
p.OffsetY(cameraImageData, 1);
}
// _dialogDrawingCanvas is a wxPaintDC*
_dialogDrawingCanvas->DrawBitmap(cameraImage, 50, 50);
編集 トーマス・マシューズの提案に基づいてwxImageを見ました。wxImage の使用は、testBuffer を使用する場合は機能しますが、実際のバッファーを使用する場合は機能しません。
これは機能します:
uint8_t testBuffer[] =
{
250, 220, 222, 223, 210,
186, 22, 29, 89, 110,
250, 220, 222, 203, 210,
240, 120, 220, 123, 210,
230, 210, 252, 223, 210
};
wxImage image(5, 5, testBuffer, true);
wxBitmap bmp(image);
_dialogDrawingCanvas->DrawBitmap(bmp, 50, 50);
ただし、以下のコードはそうではありません。wxBitmap ctor でクラッシュします。
// Returns instance of a class that provides access to camera image.
CameraImage camImage = grabCameraImage();
uint8_t* buf = camImage.getBuffer();
wxImage image(camImage.getWidth(), camImage.getHeight(), buf, true);
wxBitmap bmp(image); // Crashes here.
_dialogDrawingCanvas->DrawBitmap(bmp, 50, 50);
私が得るクラッシュは次のとおりです。
[redacted].exe の 0x000007fdcf824b5b での初回例外: 0xC0000005: アクセス違反の読み取り場所 0x000000000304d27a. [redacted].exe の 0x000007fdcf824b5b で未処理の例外: 0xC000041D: ユーザーのコールバック中に未処理の例外が発生しました。
編集 2 wxWidgets DLL をそのソース コードにリンクし、wxBitmap ctor への呼び出しをトレースしました。少なくとも 24BPP を期待しているようで、wxImage バッファの最後から読み取りを開始し、逆方向に進むため、バッファの最後の 3 バイトであると思われるものにアクセスしようとするとすぐにクラッシュします。wxBitmap コンストラクターへの depth 引数が無視されているようです。固定サイズの配列だったので、おそらくこれは testBuffer の問題ではなかったと思います。