Как вывести это 24-битное изображение в Qt - PullRequest
1 голос
/ 19 января 2011

У меня есть массив без знака, который определен следующим образом:

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

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

Где H - высота изображения, W - ширина, а символы заполняются в оставшейся части цикла этой функции.по строкам х столбцов входного изображения.Символы заполняются в порядке Red Green Blue

Я пытаюсь прочитать это примерно так:

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());

, где символы возвращены этой вызывающей функции в массиве imageData.

Что я делаю не так?Должен ли я использовать другой формат, хотя я четко выделяю 3 знака без знака на пиксель (именно поэтому я выбрал формат RGB888).Этот код после публикации возвращает изображение, но оно отображается неправильно - частично зашифровано, размыто и т. Д.

Спасибо

1 Ответ

4 голосов
/ 19 января 2011

Вы можете создать 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

...