Qt QImage显示错误的灰度图像

5
我想在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个回答

2
我的猜测是,在你能够显示它之前,缓冲区已被释放并部分覆盖。在使用不执行深度复制的构造函数时,你有责任确保数据缓冲区保持有效。
引用自 Qt文档:

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

缓冲区必须在 QImage 和所有未被修改或从原始缓冲区分离的副本的生命周期内保持有效。图像在销毁时不会删除缓冲区。你可以提供一个函数指针 cleanupFunction,以及一个额外的指针 cleanupInfo,当最后一个副本被销毁时将调用它。


我将矩阵转换为静态矩阵,问题得到解决。 - Moh

1
你不应该使用矩阵,而是使用大小为256x256 = 65535的数组, 所以不要使用:
uchar imageArray[256][256]; 

use :

uchar imageArray[65536];

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

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

2
256x256 = 65536? - eyllanesc
谢谢你的解决方案,但是我已经尝试了,没有成功!(它显示了与定义2D数组相同的结果) - Moh
你尝试过使用 Format_Grayscale8 和 Format_Indexed8 吗? - Hayfa
另外,请问您是如何填充数组的? - Hayfa
我尝试了Format_Grayscale8和Format_Indexed8两种格式。我的Indexed8代码如下所示。矩阵是通过代码中提到的循环填充的。 - Moh

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接