1

次のように定義されたunsignedchar配列があります。

unsigned char **chars = new unsigned char *[H];
for(int i = 0; i < H; i++)
{

    chars[i] = new unsigned char[W*3];
}

ここで、Hは画像の高さ、Wは幅であり、charは、入力画像の行x列をループする残りの関数に入力されます。文字は赤、緑、青の順序で入力されます

私は次のようなものでそれを読み込もうとしています:

QImage *qi = new QImage(imwidth, imheight, QImage::Format_RGB888);
    for (int i = 0 ; i < imheight ; i++)
        for (int j = 0 ; j < imwidth ; j++)
        {      //not sure why, but have to flip j and i in the index for setPixel
               qi->setPixel(j,i,qRgb(imageData[i][j],imageData[i][j+1],imageData[i][j+2]));
               j+=3;

           }

   QPixmap p(QPixmap::fromImage(*qi,Qt::AutoColor));
   QPixmap p1(p.scaled(ui->menuBar->width(),ui->menuBar->width(), Qt::KeepAspectRatio, Qt::SmoothTransformation ));
   ui->viewLabel->setPixmap(p1);
   ui->viewLabel->setFixedHeight(p1.height());
   ui->viewLabel->setFixedWidth(p1.width());

ここで、charsはimageData配列のこの呼び出し関数に返されました。

私は何が間違っているのですか?ピクセルごとに3つの符号なし文字を明確に割り当てているにもかかわらず、別の形式を使用する必要があります(これが、RGB888形式を選択した理由です)。投稿されたこのコードは画像を返しますが、正しく表示されていません-部分的にスクランブルされている、色あせているなど

ありがとう

4

1 に答える 1

4

すべてのピクセルをコピーすることなく、データのブロックから QImage を直接作成できます。

画像は別々の行に保存されるため、次のようなものが必要です

QImage image = new QImage(width,height,QImage::RGB888)

for (int h=0;h<height;h++) {
    // scanLine returns a ptr to the start of the data for that row
    memcpy(image.scanLine(h),chars[h],width*3);
}

RGB32 を使用する場合は、各ピクセルのアルファ チャネルを手動で 0xff に設定する必要があります。最初にデータ全体を memset() して 0xff にするだけです。

于 2011-01-19T00:35:34.480 に答える