Михаил Сермяжко
Михаил Сермяжко14 февраля 2022 г. 9:24

Мерцание при обновлении картинки в QML

QML, Android, Qt

Добрый день.
Получаю от сервера 10-30 картинок в секунду, вот так преобразовываю

QUrl AppCore::imageToUrl(const QImage &image)
{
    QByteArray byteArray;
    QBuffer buffer(&byteArray);
    buffer.open(QIODevice::WriteOnly);
    image.save(&buffer, "png");
    QString base64 = QString::fromUtf8(byteArray.toBase64());
    return QString("data:image/png;base64,") + base64;
}

и отправляю QUrl в sourse Image. На десктопе все более менее работает, только при обновлении других виджетов может получится мерцание. На андроите получается постоянное мерцание (исчезновение карти, отображение фона, последующее отображение картинки). Скажите пожалуйста, в чем может быть дело и как это можно исправить? Может быть можно перевести картинки в видео и так их отображать в QML?

Рекомендуем хостинг TIMEWEB
Рекомендуем хостинг TIMEWEB
Стабильный хостинг, на котором располагается социальная сеть EVILEG. Для проектов на Django рекомендуем VDS хостинг.

Вам это нравится? Поделитесь в социальных сетях!

9
Evgenii Legotckoi
  • 14 февраля 2022 г. 9:33
  • (ред.)

Добрый день,
Это у вас типо видеострима работает? А покажите кусок кода, где это функция применяется?
Может дело в том, что у вас пустует source пока конвертируется изображение? Я бы в этом случае испускал сигнал с QUrl вместо прямого использования метода. В таком случае можно будет приконнектиться к AppCore и реагировать уже на готовое изображение и только тогда менять source изображения.

    Михаил Сермяжко
    • 14 февраля 2022 г. 9:52

    Я получаю ответ от сервера с картинкой в виде массива байт и так обрабатываю через Q_PROPERTY

    setProperty("iRImageUrl", "data:image/png;base64," + doc.object()["data"].toString());
    

    Так же я пробовал испускать сигнал и передавать полученное значение в QML в source, но мерцание при обновлении сохранилось

    emit currentIRImageChanged("data:image/png;base64," + doc.object()["data"].toString());
    
      Evgenii Legotckoi
      • 14 февраля 2022 г. 10:01
      • (ред.)

      Я думаю, что вашу проблему мог бы решить QQuickImageProvider

      Вполне возможно что все эти мерцания из-за того, что изображение обновляется совместно со всем интерфейсом, а если это сделать через QQuickImageProvider, то там это будет работать более асинхронно, что может решить проблему.

      Тем более, что здесь говорится как раз про потоковую передачу изображений в Image объект в QML

      The QQuickImageProvider class provides an interface for supporting pixmaps and threaded image requests in QML

        Михаил Сермяжко
        • 15 февраля 2022 г. 4:08
        • (ред.)

        Попробовал. Не помогло.
        Класс сделал так

        class ImageProvider : public QQuickImageProvider
        {
        public:
            ImageProvider() : QQuickImageProvider(QQuickImageProvider::Pixmap)
            {
            }
        
            QPixmap m_pixmap = QPixmap("/home/owner/Загрузки/image_2022-02-04_15-52-48.png");
        
            QPixmap requestPixmap(const QString &id, QSize *size, const QSize &requestedSize) override
            {
                return m_pixmap;
            }
        };
        

        В мэйне записал так

        engine.addImageProvider(QLatin1String("imageProviderIRImage"),  appCore->m_imageProviderIRImage);
        

        В QML задал источник так

        source: "image://imageProviderIRImage"
        

        Но при такой реализации отображается только заданная в классе картинка, оно не обновляется при изменении m_pixmap
        m_pixmap меняю так

        QByteArray arr = QByteArray::fromBase64(doc.object()["data"].toString().toLatin1());
                    m_imageProviderIRImage->m_pixmap.loadFromData(arr);
        

        функция requestPixmap вызфвается только один раз

          Evgenii Legotckoi
          • 15 февраля 2022 г. 4:47

          Думаю, тут посложнее код должен быть, я бы попробовал совместить код из imageToUrl, чтобы заменять картинку в провайдере. Пока у меня только такие мысли есть.

            Михаил Сермяжко
            • 15 февраля 2022 г. 4:58

            Дело в том,что в провайдере и так меняется картинка, просто похоже это дергается только один раз при вызове в мэйне.

              Evgenii Legotckoi
              • 15 февраля 2022 г. 5:49

              Эммм, может тогда ещё поиграть с настройками самого Image? В документации сказано, что есть следующие свойства:

              • asynchronous - асинхронная загрузка, которая по умолчанию false, кроме изображений из сети.
              • cache - кэширование изображений, которое по умолчанию true, может при изменении изображения в источнике, из-за кеширование не срабатывает?

              Я уже не знаю, сейчас разве что только пальцем в небе попаду.

                Михаил Сермяжко
                • 15 февраля 2022 г. 5:58
                • Ответ был помечен как решение.

                Я сделал сигнал обновления картинки и менял потом source картинки так, в таком случае работает без мерцания

                                        imageIrImage.source = "image://imageProviderIRImage/ir"
                                        imageIrImage.source = "image://imageProviderIRImage"
                
                  Evgenii Legotckoi
                  • 15 февраля 2022 г. 6:03

                  Получается, что доколупали.
                  Решение - QQuickImageProvider + сигнал на обновление. Тоже вариант.

                    Комментарии

                    Только авторизованные пользователи могут публиковать комментарии.
                    Пожалуйста, авторизуйтесь или зарегистрируйтесь
                    AD

                    C++ - Тест 004. Указатели, Массивы и Циклы

                    • Результат:50баллов,
                    • Очки рейтинга-4
                    m
                    • molni99
                    • 26 октября 2024 г. 1:37

                    C++ - Тест 004. Указатели, Массивы и Циклы

                    • Результат:80баллов,
                    • Очки рейтинга4
                    m
                    • molni99
                    • 26 октября 2024 г. 1:29

                    C++ - Тест 004. Указатели, Массивы и Циклы

                    • Результат:20баллов,
                    • Очки рейтинга-10
                    Последние комментарии
                    ИМ
                    Игорь Максимов22 ноября 2024 г. 11:51
                    Django - Урок 017. Кастомизированная страница авторизации на Django Добрый вечер Евгений! Я сделал себе авторизацию аналогичную вашей, все работает, кроме возврата к предидущей странице. Редеректит всегда на главную, хотя в логах сервера вижу запросы на правильн…
                    Evgenii Legotckoi
                    Evgenii Legotckoi31 октября 2024 г. 14:37
                    Django - Урок 064. Как написать расширение для Python Markdown Добрый день. Да, можно. Либо через такие же плагины, либо с постобработкой через python библиотеку Beautiful Soup
                    A
                    ALO1ZE19 октября 2024 г. 8:19
                    Читалка fb3-файлов на Qt Creator Подскажите как это запустить? Я не шарю в программировании и кодинге. Скачал и установаил Qt, но куча ошибок выдается и не запустить. А очень надо fb3 переконвертировать в html
                    ИМ
                    Игорь Максимов5 октября 2024 г. 7:51
                    Django - Урок 064. Как написать расширение для Python Markdown Приветствую Евгений! У меня вопрос. Можно ли вставлять свои классы в разметку редактора markdown? Допустим имея стандартную разметку: <ul> <li></li> <li></l…
                    d
                    dblas55 июля 2024 г. 11:02
                    QML - Урок 016. База данных SQLite и работа с ней в QML Qt Здравствуйте, возникает такая проблема (я новичок): ApplicationWindow неизвестный элемент. (М300) для TextField и Button аналогично. Могу предположить, что из-за более новой верси…
                    Сейчас обсуждают на форуме
                    m
                    moogo22 ноября 2024 г. 7:17
                    Mosquito Spray System Effective Mosquito Systems for Backyard | Eco-Friendly Misting Control Device & Repellent Spray - Moogo ; Upgrade your backyard with our mosquito-repellent device! Our misters conce…
                    Evgenii Legotckoi
                    Evgenii Legotckoi24 июня 2024 г. 15:11
                    добавить qlineseries в функции Я тут. Работы оень много. Отправил его в бан.
                    t
                    tonypeachey115 ноября 2024 г. 6:04
                    google domain [url=https://google.com/]domain[/url] domain [http://www.example.com link title]
                    NSProject
                    NSProject4 июня 2022 г. 3:49
                    Всё ещё разбираюсь с кешем. В следствии прочтения данной статьи. Я принял для себя решение сделать кеширование свойств менеджера модели LikeDislike. И так как установка evileg_core для меня не была возможна, ибо он писался…

                    Следите за нами в социальных сетях