从unsigned char *数据构造QImage

时间:2010-10-27 08:45:56

标签: qt qimage data-capture

我遇到了将Image对象(使用Point Grej FlyCapture2 SDK捕获)传递给QImage对象的问题。我按功能获得了与图像数据相关的指针:

virtual unsigned char* FlyCapture2::GetData  (   ) 

然后通过以下方式加载数据:

QImage::QImage ( uchar * data, int width, int height, int bytesPerLine, Format format )

两个Image对象的数据格式都是8位单色。 BytesPerLine参数应该等于Image的宽度(我已经通过将FlyCapture2 :: Image保存到.bmp并将其加载到QImage来检查它)。

问题是从unsigned char *转换为uchar *吗? 你还有其他建议吗?逐像素复制图像太慢了。

编辑:我正在将FlyCapture捕获的图像转换为FlyCapture2::PIXEL_FORMAT_RGB8,其中:R = G = B = 8位,在PGR::SnapShot()函数内。 SnapShot()返回unsigned char * const。  这是我的Qt显示功能的一部分:

unsigned char *const img = PGRSystem->SnapShot();
QImage Img(img, 1024, 768, QImage::Format_RGB888);
QGraphicsScene *Scene = new QGraphicsScene();
Scene->addPixmap(QPixmap::fromImage(Img));
ui.ImageView->setScene(Scene);
ui.ImageView->fitInView(ui.ImageView->itemAt(100,100));
delete [] Scene;

我也尝试将Img保存到文件中,但是后来得到了未处理的异常。我尝试了其他像素格式对(FlyCapture2::PIXEL_FORMAT_RGB - 24位RGB与QImage::RGB88 8和FlyCapture2::PIXEL_FORMAT_RGBU32QImage::RGB32

值得一提的是,我使用的QImage构造函数没有设置colorTable(我在检查QImage是否为grayScale时遇到异常)。 我猜我需要一些帮助。

2 个答案:

答案 0 :(得分:5)

第一件事 - QImage不支持原生灰度图像,这听起来好像你正在输出 - 所以我很想知道你正在使用什么格式参数。可能最简单的解决方案,虽然内存无效,但是通过将每个值复制三次(进入新的QByteArray)将灰度图像扩展为RGB。

另外一个问题是你正在使用的特定QImage构造函数复制底层数据,所以你需要确保从GetData()返回的指针超过QImage - 或强制QImage在内部制作副本,比如使用QImage :: copy。

正如其他受访者所述,查看更多代码会有所帮助。

答案 1 :(得分:1)

非常感谢您的帮助,您对图像格式的看法是正确的。不幸的是,主要问题与在函数之间传递指针有关。在PGR :: SnapShot()中我创建了FlyCapture2 :: Image,然后我得到了指向数据的指针。 FlyCapture2 ::图像在退出函数时被破坏,因此返回的指针是BadPtr。