2

我有一些遗留代码正在写入 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;

data 是我原始的无符号字符数组。

所以现在我正在尝试获取该数据数组并将其输出到我的 GUI 中的 QImage 中。

在我看来,在 NITF 中,有一块 LUT 数据的大小为“行 x 列”,对吧?所以我创建了一个 lu 数据数组:

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]));
                }
   }

但是,这似乎或多或少只是给了我一个灰度图像,而不是我的实际数据。

我究竟做错了什么?

谢谢!

4

2 回答 2

3

qRgb 构造函数如下所示:

qRgb(int r, int g, int b)

lutData[i*imwidth + j]为所有三种颜色传递了相同的值 ( ),因此您最终会得到一个灰度图像。

现在, qRgb 只是一个typedefed unsigned int,所以如果你以这种格式(RGB32 / ARGB32)存储你的颜色,你可以调用:

qi->setPixel(j, i, lutData[i*imwidth + j])

但是您可能想研究使用 QImage 的内置查找表(又名颜色表)支持 - 它可能最终很简单:

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):

#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();
} 
于 2011-03-31T19:42:55.260 回答
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);

当它从 888 转换为 8 位数据时,它基本上填满了 8 位颜色表。为了获得更好的结果,您可以在索引处累积 RGB 值,然后在将它们放入颜色表之前平均这些值。它还可以对遍历图像缓冲区进行一些优化。

于 2011-04-01T01:16:20.057 回答