我在获取Qt5以保存灰度Format_Indexed8
图像时遇到问题。当我保存文件时,我得到了一个没有相关功能的多色混乱。我期待着一个灰度BMP。
单色图像被存储为CCD_ 2。
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的版本。
问题是在使用图像之前没有在图像中设置颜色表(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");
Qt的新版本引入了Format_Grayscale8
,因此可以保存八位灰度图像,如:
QImage mySurface(noise,widthGL,heightGL,QImage::Format_Grayscale8);
mySurface.save("test.bmp","BMP");
当我注意到@owacooder提出的方法实际上开始产生无效的BMP文件时,我重新审视了这个问题,这些文件没有用ImageJ或Paint打开(无论出于什么原因)。