Вопрос

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

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

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

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

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

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

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

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

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

Это было полезно?

Решение

Просто предположение, но из (неправильных) цветов, которые вы упомянули, я подозреваю, что проблема может быть с вашим кодом распределения/инициализации в отношении char **rgbMapped переменная. Не могли бы вы опубликовать этот код?

Я постараюсь написать, возможно, правильный (?) Код инициализации, чтобы дать вам подсказку, который может помочь (я не составляю код, поэтому я извиняюсь за любые ошибки синтаксиса). Я использую Malloc (), но вы также можете использовать новый () оператор ().

// 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с.

Другие советы

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top