2

いくつかの画像を表示するために NITF ファイルに書き込んでいたレガシー コードがいくつかあります。従来のコードでは、LUT が使用されているかのように見え、一度に 1 行ずつ 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 では、サイズが「rows x cols」の LUT データのブロックがあったように思えますよね? そこで、その 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]));
                }
   }

ただし、これは多かれ少なかれ、実際のデータではなく、グレースケールの画像を提供するだけのようです。

私は何を間違っていますか?

ありがとう!

4

2 に答える 2

3

qRgb コンストラクターは次のようになります。

qRgb(int r, int g, int b)

lutData[i*imwidth + j]3 つの色すべてに同じ値 ( ) を渡すため、最終的にグレースケールの画像になります。

現在、 qRgb は単なるtypedefedunsigned 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 に答える