gpt4 book ai didi

c++ - 使用 wxWidgets 将内存中的 8 位灰度图像缓冲区绘制到屏幕

转载 作者:塔克拉玛干 更新时间:2023-11-03 07:27:44 33 4
gpt4 key购买 nike

我想将 8 位灰度图像数据绘制到 wxPaintDC 中,但一直遇到问题。数据以 uint8_t 数组的形式提供给我。请参阅下面的非工作代码(这是几次尝试之一)。我能够使用其他 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);

编辑我根据 Thomas Matthews 的建议查看了 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);

我得到的崩溃是:

First-chance exception at 0x000007fdcf824b5b in [redacted].exe: 0xC0000005: Access violation reading location 0x000000000304d27a. Unhandled exception at 0x000007fdcf824b5b in [redacted].exe: 0xC000041D: An unhandled exception was encountered during a user callback.

编辑 2我将 wxWidgets DLL 链接到它的源代码,并跟踪到对 wxBitmap ctor 的调用。看起来它至少需要 24BPP,并在 wxImage 缓冲区的末尾开始读取并向后移动,因此一旦它试图访问它认为是缓冲区的最后 3 个字节,它就会崩溃。看起来 wxBitmap 构造函数的深度参数被忽略了。我认为这可能不是 testBuffer 的问题,因为它是一个固定大小的数组。

最佳答案

这在我的编辑中基本上得到了回答,但问题是在缓冲区中使用了 8 BPP 数据引起的。我能够完成我想做的事情如下:

CameraImage camImage = grabCameraImage(); 
wxImage image(camImage.getWidth(), camImage.getHeight());
const uint8_t* cameraBuffer = camImage.getBuffer();
for(uint16_t y = 0; y < camImage.getHeight(); ++y)
{
for(uint16_t x = 0; x < camImage.getWidth(); ++x)
{
uint8_t intensity = cameraBuffer[y * camImage.getWidth() + x];
image.SetRGB(x, y, intensity, intensity, intensity);
}
}
wxBitmap bmp(image, 8);
_dialogDrawingCanvas->DrawBitmap(bmp, 50, 50);

关于c++ - 使用 wxWidgets 将内存中的 8 位灰度图像缓冲区绘制到屏幕,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16572989/

33 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com