Qt QImage显示错误的灰度图像

问题描述 投票:4回答:2

我想在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);
c++ qt grayscale qimage
2个回答
2
投票

我的猜测是你的缓冲区被解除分配并被部分覆盖,然后才能显示它。在使用不执行深层复制的构造函数时,确保数据缓冲区保持有效是您的责任。

引自the Qt documentation

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

缓冲区必须在QImage的整个生命周期内保持有效,并且所有未复制或以其他方式从原始缓冲区中分离的副本都必须保持有效。图像不会在销毁时删除缓冲区。您可以提供一个函数指针cleanupFunction以及一个额外的指针cleanupInfo,它将在销毁最后一个副本时被调用。


1
投票

您不应该使用矩阵,而是使用大小为256x256 = 65535的数组, 所以代替:

uchar imageArray[256][256]; 

使用 :

uchar imageArray[65536];

然后用您想要的值填充数组。然后,调用QImage的构造函数:

QImage image(imageArray, 256, 256, QImage::Format_Grayscale8);
© www.soinside.com 2019 - 2024. All rights reserved.