如何在不复制内存的情况下创建灰度QImage(QImage :: Format_ Indexed)

时间:2012-11-28 03:00:24

标签: qt opencv

我正在尝试创建包装由OpenCv创建的现有图像缓冲区的QImage 我正在考虑使用以下构造函数来执行此操作。

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

所以,我的代码就像

QImage qimage((const uchar*)iplImage->imageData, 
              iplImage->width, iplImage->height, 
              iplImage->widthStep, 
              QImage::Format_Indexed);     // image buffer not copied!
qimage.setColorTable(grayScaleColorTable); // color table's item count 256 for grayscale.
                                           // now new image buffer is allocated here.

好的,在调用此ctor时,实际上没有完成内存复制。 但是,这是我的问题。 QImage::setColorTable()是非const成员函数,其中QImage通过其内部detach()函数分配新的图像缓冲区以进行复制。

我发现Qt3支持这种问题,其中ctor可以接受颜色表作为其ctor中的参数,但我没有在>中找到任何这样的支持。 Qt4的。

如何为现有图像缓冲区创建灰度QImage?

提前致谢

[EDITED]

感谢Stephen Chu,我意识到跟随contstructors创建可读/写的QImage对象

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

即使在实例化之后立即调用QImage::setColorTable(),也不会分配新的缓冲区。另一方面,以下构造函数接收'const'ed数据缓冲区创建只读QImage对象,当调用任何非{const}成员函数QImage::setColorTable()时,新缓冲区被分配并从原始缓冲区深度复制(我这样做)不想要。)

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

0 个答案:

没有答案