我有一些遗留代码正在写入NITF文件以显示一些图像。在遗留代码中,似乎有一个LUT被使用,并且有一段代码一次写出一行到NITF文件,并且该行的值计算如下:
// convert RGB to LUT values
unsigned char *lutData = new unsigned char[numBytes/3];
for (unsigned j = 0 ; j < numBytes/3 ; j++)
lutData[j] = (unsigned char) stuff;
数据是我原始的无符号字符数组。
所以现在我正在尝试获取该数据数组并将其输出到我的GUI中的QImage中。
在我看来,在NITF中,有一块LUT数据大小是“行x列”,对吧?所以我创建了一个lut数据的数组:
unsigned char *lutData = new unsigned char[imwidth * imheight];
QImage *qi = new QImage(imwidth,imheight, QImage::Format_Indexed8);
for (int i = 0 ; i < imheight ; i++)
{
#pragma omp parallel for
for (int j = 0 ; j < imwidth ; j++)
{
lutData[i*imwidth + j] = stuff;
}
}
然后我试着像这样填充qimage:
for (int i = 0 ; i < imheight ; i++)
{
#pragma omp parallel for
for (int j = 0 ; j < imwidth ; j++)
{
qi->setPixel(j,i,qRgb(lutData[i*imwidth + j],lutData[i*imwidth + j],lutData[i*imwidth + j]));
}
}
然而,这似乎或多或少只是给我一张灰度图像,而不是我的实际数据。
我做错了什么?
谢谢!
答案 0 :(得分:2)
qRgb构造函数如下所示:
qRgb(int r, int g, int b)
您为所有三种颜色传递了相同的值(lutData[i*imwidth + j]
),因此您最终会得到一个灰度图像。
现在,qRgb只是typedef
ed unsigned int
,因此如果您将颜色存储在format(RGB32 / ARGB32)中,则可以调用:
qi->setPixel(j, i, lutData[i*imwidth + j])
但您可能希望使用QImage的built-in lookup表(也就是颜色表)支持 - 它可能最终变得如此简单:
QImage image(data, imwidth, imheight, QImage::Format_Indexed8);
QVector<QRgb> colorTable;
// Translate each color in lutData to a QRgb and push it onto colorTable;
image.setColorTable(colorTable);
希望这有帮助!
更新:出于参考目的,这里是我用于在索引颜色模式下尝试QImage的测试代码(使用g ++编译时没有警告 - 只记得链接到-lQtCore和-lQtGui): / p>
#include <QtCore/QVector>
#include <QtGui/QApplication>
#include <QtGui/QImage>
#include <QtGui/QLabel>
#include <QtGui/QPixmap>
int main(int argc, char* argv[])
{
QApplication app(argc, argv);
unsigned char indices[1024];
for(int i = 0; i < 1024; ++i)
{
indices[i] = qrand() & 0x0f;
}
QVector<QRgb> ctable;
for(int i = 0; i < 16; ++i)
{
ctable.append(qRgb(qrand() & 0xff, qrand() & 0xff, qrand() & 0xff));
}
QImage image(indices, 32, 32, QImage::Format_Indexed8);
image.setColorTable(ctable);
QLabel label;
label.setPixmap(QPixmap::fromImage(image));
label.show();
return app.exec();
}
答案 1 :(得分:0)
非常有趣的图像压缩。这是我尝试使用您的函数将RGB888图像转换为Index8:
QImage image8(image.size(), QImage::Format_Indexed8);
QVector<QRgb> lut(256);
for(int i=0;i<image888.height();++i) {
const uchar * p = image888.bits() + image888.bytesPerLine()*i;
uchar * q = image8.bits() + image8.bytesPerLine()*i;
for(int j=0;j<image.width();++j, p+=3) {
QRgb c = qRgb(p[0], p[1], p[2]);
int n = qRed(c)/51*36 + qGreen(c)/51*6+qBlue(c)/51;
lut[n] = c;
*q++ = n;
}
}
image8.setColorTable(lut);
它基本上填满了8位颜色表,因为它从888转换为8位数据。为了获得更好的结果,您可以在索引处累积RGB值,然后在将值放入颜色表之前对这些值进行平均。它还可以在步行图像缓冲区时使用一些优化。