Qt QImage显示错误的灰度图像

时间:2019-03-19 07:25:01

标签: c++ qt grayscale qimage

我想在Qt 5.12中将0到255之间的整数矩阵可视化为灰度图像。首先,我构建了一个示例256x256 uchar数组,每行的值在0到255之间。然后我尝试以QImage和format_grayscale作为格式显示图像。但是令人困惑的是,生成的图像在最后一行中包含受干扰的像素。

结果图像

我还创建了一个灰度彩色地图,并尝试使用format_indexed8,但结果相同。这是我的代码。

uchar imageArray[256][256];
for (int i = 0; i < 256; i++)
{
    for (int j = 0; j < 256; j++)
    {
        imageArray[i][j] = uchar(j);
    }
}

QImage image(&imageArray[0][0],
                256,
                256,
                QImage::Format_Grayscale8);

2 个答案:

答案 0 :(得分:2)

我的猜测是,在释放缓冲区之前,缓冲区已被释放并被部分覆盖。您有责任确保在使用不执行深度复制的构造函数时,数据缓冲区保持有效。

引用the Qt documentation

  

构造具有给定宽度,高度和格式的图像,该图像使用   现有的内存缓冲区数据。宽度和高度必须为   以像素为单位指定。 bytesPerLine指定每字节的字节数   线(步幅)。

     

在QImage和所有QImage的整个生命周期中,缓冲区必须保持有效   尚未修改或以其他方式脱离的副本   原始缓冲区。映像不会删除销毁的缓冲区。   您可以提供函数指针cleanupFunction以及其他功能   指针cleanupInfo,当最后一个副本是   毁了。

答案 1 :(得分:1)

您不应使用矩阵,而应使用大小为256x256 = 65535的数组,
因此,而不是:

uchar imageArray[256][256]; 

使用:

uchar imageArray[65536];

然后用所需的值填充数组。 然后,调用QImage的构造函数:

QImage image(imageArray, 256, 256, QImage::Format_Grayscale8);