Qt
September 25, 2024

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