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 中,这个问题很有可能得到解决。

4

2 回答 2

1

问题是在使用之前没有在图像中设置颜色表。从 Qt 文档(http://doc.qt.io/qt-5/qimage.html#QImage-4):

如果 format 是索引颜色格式,则图像颜色表最初为空,并且必须在使用图像之前使用 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");
于 2015-08-28T12:37:00.763 回答
0

较新版本的 Qt 引入了Format_Grayscale8,因此可以保存 8 位灰度图像,如下所示:

QImage mySurface(noise,widthGL,heightGL,QImage::Format_Grayscale8);
mySurface.save("test.bmp","BMP");

当我注意到@owacoder 提出的方法实际上开始生成无法使用 ImageJ 或 Paint 打开的无效 BMP 文件(无论出于何种原因)时,我重新审视了这个问题。

于 2017-02-27T02:03:56.683 回答