2013-05-15 53 views
2

我想绘制一个wxPaintDC的8位灰度图像数据,但我遇到了麻烦。这些数据在uint8_t数组中可用。请参阅下面的非工作代码(这是几次尝试之一)。我能够使用其他wxPaintDC :: Draw *函数进行绘制,所以我相信其他所有设置都很好。使用wxWidgets绘制内存中的8位灰度图像缓冲区

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基于由托马斯·马修斯提出的建议。当我使用testBuffer时使用wxImage,但在使用实际缓冲区时不起作用。

这工作:

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); 

我得到的崩溃是:

在0x000007fdcf824b5b第一次机会异常[删除] .exe文件:0000005:访问冲突读取位置0x000000000304d27a。 [redacted] .exe中0x000007fdcf824b5b未处理的异常:0xC000041D:在用户回调期间遇到未处理的异常。

编辑2 我联wxWidgets的DLL它的源代码和追踪到该呼叫到wxBitmap构造函数。它看起来像期望至少24BPP,并开始读取在wxImage缓冲区的末尾,并向后退,所以一旦它试图访问它认为是缓冲区的最后3个字节时就会崩溃。它看起来像wxBitmap构造函数的深度参数被忽略。我想也许这不是testBuffer的问题,因为它是一个固定大小的数组。

+1

研究wxImage。 wxImage类可以转换为wxBitmap。 –

+0

wxImage在我的测试阵列上工作,但不是实际的,它要大得多。我很快会编辑我的帖子。 –

回答

1

这基本上是在我的编辑中回答的,但问题是由于在缓冲区中使用了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);