如何在Qt 5中保存灰度图像

3

我在使用Qt5保存灰度Format_Indexed8图像时遇到了问题。

当我保存文件时,得到的是一堆杂乱无章的彩色图片,没有相关特征。我期望得到的是一张灰度BMP图片。

这张单色图像被存储为sizeof(uchar)*widthGL*heightGL

glTexSubImage2D(GL_TEXTURE_2D,0,0,0,widthGL,heightGL,
                GL_LUMINANCE,GL_UNSIGNED_BYTE,noise);
//computation   
QImage mySurface(noise,widthGL,heightGL,QImage::Format_Indexed8);
mySurface.save("test.bmp","BMP");

我的当前解决方案涉及使用第二个数组,感觉很不好

static unsigned char* mbuffer = new unsigned char[3*widthGL*heightGL];
for (int i = 0,bpos=0;i<widthGL*heightGL;i++)
{
mbuffer[bpos++]=noise[i];
mbuffer[bpos++]=noise[i];
mbuffer[bpos++]=noise[i];
}
QImage mySurface(mbuffer,widthGL,heightGL,QImage::Format_RGB888);

我想知道是否有任何方法可以让Qt5输出类似灰度图像的内容。
编辑
引用:
有很大的可能这个问题在最新版本的Qt中已经解决了。
2个回答

1
问题在于在使用图像之前未设置颜色表。来自Qt文档(http://doc.qt.io/qt-5/qimage.html#QImage-4):
如果格式是索引颜色格式,则图像颜色表最初为空,并且必须使用setColorCount()或setColorTable()进行足够的扩展,然后才能使用该图像。
你可以尝试这个:
glTexSubImage2D(GL_TEXTURE_2D,0,0,0,widthGL,heightGL,GL_LUMINANCE,GL_UNSIGNED_BYTE,noise);
//computation
QVector<QRgb> colorTable(256); //our grayscale palette
QImage mySurface(noise,widthGL,heightGL,QImage::Format_Indexed8);
for (int i = 0; i < 256; ++i)
     colorTable[i] = qRgb(i, i, i); //build palette
mySurface.setColorCount(256);
mySurface.setColorTable(colorTable);
mySurface.save("test.bmp","BMP");

0
Qt的新版本引入了Format_Grayscale8,因此可以像下面这样保存8位灰度图像:
QImage mySurface(noise,widthGL,heightGL,QImage::Format_Grayscale8);
mySurface.save("test.bmp","BMP");

当我注意到@owacoder提出的方法实际上开始生成无效的BMP文件,无法在ImageJ或Paint中打开(不论原因是什么),我重新审视了这个问题。


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