1

私が準拠しようとしている関数には、double[19200] 型の 3 つの 1 次元配列が必要です。次の配列は、次のような RGB 配列です。

double r[19200]; // r
double g[19200]; // g
double b[19200]; // b

これまでのところ、QImage からピクセル情報を抽出し、上記の配列にデータを入力できます。

問題はテストにあります。逆の方法がわかりません。3 つの 1 次元配列がある場合、このデータから新しい QImage を作成するにはどうすればよいですか?

実際に正しい値を取得していることを確認したいと思います。(列と行の優先順位のようなものは、私に疑問を投げかけています)。その結果、これら 3 つの 1-D 次元配列から QImage というイメージを構築しようとしています。

4

2 に答える 2

2

1つの方法でなんとかしたのに、なぜ問題が発生するのか、私にはよくわかりません。プロセスは基本的に同じです。

for (int x=0; x<w; x++)
  for (int y=0; y<h; y++)
     image.setPixel(x,y, convertToRGB(r[x*w+y], ...);

画像convertToRGBの次元がw*h. これが間違った行優先/列優先のバリアントであることがわかった場合は、それを逆にしてください。

色空間の変換方法についての情報が提供されておらず、行優先か列優先かがわからないため、それ以上のことはできません。

于 2011-06-09T05:07:08.477 に答える
1

QImage は、ピクセル配列からロードする方法をいくつかサポートしているようです。

QImage(const uchar *data, int width, int height, Format format)
bool QImage::loadFromData(const uchar *buf, int len, const char *format=0)

最初の例を使用すると、言及した配列がある場合、QImage::Format_RGB888 (qimage.h から) の形式を使用する可能性があります。

幅と高さを自分で知る必要があります。

最後に、配列を単一の uchar* 配列に再パックする必要があります

uchar* rgb_array = new uchar[19200+19200+19200];

for( int i = 0, j = 0; j < 19200; ++j )
{
    // here we convert from the double range 0..1 to the integer range 0..255
    rgb_array[i++] = r[j] * 255;
    rgb_array[i++] = g[j] * 255;
    rgb_array[i++] = b[j] * 255;
}

{
    QImage my_image( rgb_array, width, height, QImage::Format_RGB888 );

    // do stuff with my_image...
}

delete[] rgb_array; // note you need to hold onto this array while the image still exists
于 2011-06-09T05:14:01.777 に答える