Qt QImage показывает неправильное изображение в градациях серого - PullRequest
5 голосов
/ 19 марта 2019

Я хочу визуализировать матрицу целочисленных значений от 0 до 255 в виде изображения в оттенках серого в Qt 5.12.Во-первых, я построил образец массива 256x256 uchar со значениями от 0 до 255 в каждой строке.затем я попытался показать изображение с QImage и format_grayscale в качестве формата.Но, как ни странно, результирующее изображение содержит нарушенные пиксели в последних строках.

Результирующее изображение

Я также создал карту цветов в оттенках серого и попробовал сformat_indexed8, но результат тот же.Вот мой код.

uchar imageArray[256][256];
for (int i = 0; i < 256; i++)
{
    for (int j = 0; j < 256; j++)
    {
        imageArray[i][j] = uchar(j);
    }
}

QImage image(&imageArray[0][0],
                256,
                256,
                QImage::Format_Grayscale8);

Ответы [ 2 ]

2 голосов
/ 19 марта 2019

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

Цитирование из документации Qt :

Создает изображение с заданной шириной, высотой и форматом, которое использует существующий буфер памяти, данные. Ширина и высота должны быть указано в пикселях. bytesPerLine указывает количество байтов на линия (шаг).

Буфер должен оставаться действующим на протяжении всего жизненного цикла QImage и всех копии, которые не были изменены или иным образом отделены от оригинальный буфер. Изображение не удаляет буфер при уничтожении. Вы можете предоставить указатель функции cleanupFunction вместе с дополнительным указатель cleanupInfo, который будет вызываться, когда последняя копия разрушен. * * 1 010

1 голос
/ 19 марта 2019

Вы не должны использовать матрицу, но массив размером 256x256 = 65535,
Так что вместо:

uchar imageArray[256][256]; 

использование:

uchar imageArray[65536];

Затем заполните свой массив нужными значениями. Затем вызовите конструктор QImage:

QImage image(imageArray, 256, 256, QImage::Format_Grayscale8);
...