このデータバッファーをQimageに表示する方法
-
27-10-2019 - |
質問
Qimageで表示しようとしている画像があります。
これは、行*colsイメージに入るコードのスニペットです。
rgbMapped[row][col * 3] = red;
rgbMapped[row][col * 3 + 1] = green;
rgbMapped[row][col * 3 + 2] = blue;
ご覧のとおり、私のデータバッファーは「列の高さ」であり、「cols*3 wide」です
rgbmappedは、署名されていない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つのデータが互いに広められていれば、それは正しい画像のように思えますか?
解決
ただの仮定ですが、あなたが言及した(間違った)色から、問題はあなたの割り当て/初期化コードに関するものである可能性があると思います。 char **rgbMapped
変数。このコードを投稿していただけますか?
私はあなたに役立つかもしれないヒントを与えるために、おそらく正しい(?)初期化コードをBellowに書くようにします(コードをコンパイルしていないため、構文エラーについて謝罪します)。 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。
他のヒント
あなたは歩みを説明していますか?各スキャンラインは、4バイトの境界で開始する必要があります。また、パックされたピクセル形式ではない可能性があるため、各ピクセルは3ではなく4バイトです