Как отобразить этот буфер данных в QImage - PullRequest
0 голосов
/ 17 марта 2011

У меня есть изображение, которое я пытаюсь отобразить в QImage.

Это фрагмент кода, который заполняет строки * cols image:

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

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

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

Как вы можете видеть, мой буфер данных имеет высоту строк и ширину столбцов * 3

rgbMapped - массив без знака **. Итак, в моем коде 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, который я создал, чтобы позволить мне перехватывать некоторые события мыши, но я не буду ничего делать с любой из функций рисования или чем-либо еще.

Когда я запускаю этот код, мое возвращение возвращается как изображение, похожее на мое изображение, за исключением трех копий, одна с зеленым оттенком, одна с желтоватым оттенком и одна с заметным фиолетовым оттенком.

Кажется, может быть, это было бы правильное изображение, если бы эти три элемента данных были наложены друг на друга?

Ответы [ 2 ]

1 голос
/ 18 марта 2011

Просто предположение, но из (неправильных) цветов, которые вы упомянули, я подозреваю, что проблема может быть с вашим кодом выделения / инициализации относительно переменной 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?).Просто мой 2с.

0 голосов
/ 18 марта 2011

Вы учитываете шаг?Каждая строка сканирования должна начинаться с 4-байтовой границы.Также это может быть не формат упакованного пикселя, поэтому каждый пиксель составляет 4 байта, а не 3

...