0

QImage に表示しようとしている画像があります。

これは、rows*cols イメージを生成するコードのスニペットです。

    rgbMapped[row][col * 3] = red;

    rgbMapped[row][col * 3 + 1] = green;

    rgbMapped[row][col * 3 + 2] = blue;

ご覧のとおり、私のデータ バッファは「行の高さ」で、「列 * 3 の幅」です。

rgbMapped は unsigned char** 配列です。QTコードに戻ると、次のようになります。

QImage *qi = new QImage(getWidth(), getHeight(), QImage::Format_RGB888);

for (int h = 0; h< getHeight(); h++){
    memcpy(qi->scanLine(h), rgbMapped[h], getWidth()*3);
}
QPixmap p(QPixmap::fromImage(*qi,Qt::ColorOnly));

if(scene.items().contains(item)){
    scene.removeItem(item);
}
item = new ImagePixmapItem(p);
scene.addItem(item);
ui->graphicsView->setScene(&scene);
ui->graphicsView->show();

ImagePixMapItem は、いくつかのマウス イベントをインターセプトできるようにするために作成した QGraphicsPixmapItem ですが、ペイント関数などを操作することはありません。

このコードを実行すると、私のイメージに似たイメージとして返されますが、3 つのコピー (1 つは緑がかった色、もう 1 つは黄色がかった色、もう 1 つは目立つ紫がかった色) があります。

この 3 つのデータを重ね合わせたら、おそらく正しいイメージになるのではないでしょうか。

4

2 に答える 2

1

単なる仮定ですが、あなたが言及した(間違った)色から、問題はchar **rgbMapped変数に関する割り当て/初期化コードにあるのではないかと思います。このコードを投稿していただけませんか?

役立つ可能性のあるヒントを提供するために、おそらく正しい(?)初期化コードを以下に記述しようとします(コードをコンパイルしていないため、構文エラーをお詫びします)。私はmalloc()を使用していますが、new()演算子を使用することもできます。

// allocate a single buffer for all image pixels
unsigned char *imgbuf = malloc(3 * getWidth() * getHeight());

// allocate row pointers
unsigned char **rgbMapped = malloc(getHeight() * sizeof (unsigned char *)); 

// Initialize row pointers
for (int h=0; h < getHeight(); h++)
{
  *rgbMapped[h] = &imgbuf[h * 3 * getWidth()];
}

// ... do your processing

// Free the image buffer & row pointers
free(imgbuf);
imgbuf = NULL;
free(rgbMapped);
rgbMapped = NULL;

重要な部分は行ポインタの初期化です(* 3を忘れましたか?)。ちょうど私の2c。

于 2011-03-18T03:27:16.797 に答える
0

ストライドを考慮していますか?各スキャンラインは 4 バイト境界で開始する必要があります。また、パックされたピクセル形式ではない可能性があるため、各ピクセルは 3 バイトではなく 4 バイトです。

于 2011-03-18T14:09:55.107 に答える