Найти в Дзене

QImage. Как с высокой скоростью отображать массивы данных с помощью Qt на примере водопада

Telegram Teletype vc.ru dzen.ru

Qt 5.15

В классе QWidgetExample, наследнике от QWidget переопределяем paintEvent. Предварительно нужно в соответствии с вашими целями подготовить массив buf. Либо сразу преобразовав цвета перед формированием массива, либо через setColorTable.

В случае водопада предварительно данные нормализуем, например через ippsNormalize_32f и конвертируем в формат 8u (0...255).

При добавлении в водопад нового пакета данных переносим весь массив:

ippsCopy_32f(&buf1[0], &buf2[width], width * (height - 1)); // сдвиг
ippsCopy_32f(&buf1[0], &buf2[0], width); // добавление новых данных

Отрисовка:

QImage image1; // объект QImage, содержащий изображение массива buf
quint8* buf; // массив данных для отображения 8u (0...255) 4 канала в формате RGB 0xFFRRGGBB
// размеры водопада
int width;
int height;
protected:
void paintEvent(QPaintEvent *event);
void QWidgetExample::paintEvent(QPaintEvent * )
{
QPainter pnt(this);
image1 = QImage(buf, width, height, QImage::Format_RGB32);
// в случае пользовательской шкалы цветов
// QVector<QRgb> color_table;
// TODO тут надо заполнить color_table
// image1 = QImage(buf, width, height, QImage::Format_Indexed8);
// image1.setColorTable()
pnt.drawImage(0, 0, buf);
}

Работает с высокой скоростью!

Telegram Teletype vc.ru dzen.ru