gpt4 book ai didi

c++ - 如何在 Qt QImage 中使用颜色 LUT

转载 作者:行者123 更新时间:2023-11-30 04:35:15 27 4
gpt4 key购买 nike

我有一些遗留代码正在写入 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 数据 block 的大小是“行 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]));
}
}

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

我做错了什么?

谢谢!

最佳答案

qRgb 构造函数如下所示:

qRgb(int r, int g, int b)

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

现在,qRgb 只是一个 typedefed 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):

#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();
}

关于c++ - 如何在 Qt QImage 中使用颜色 LUT,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5504768/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com