Михаил Сермяжко
Михаил СермяжкоFeb. 14, 2022, 9:24 a.m.

Мерцание при обновлении картинки в 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?

We recommend hosting TIMEWEB
We recommend hosting TIMEWEB
Stable hosting, on which the social network EVILEG is located. For projects on Django we recommend VDS hosting.

Do you like it? Share on social networks!

9
Evgenii Legotckoi
  • Feb. 14, 2022, 9:33 a.m.
  • (edited)

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

    Михаил Сермяжко
    • Feb. 14, 2022, 9:52 a.m.

    Я получаю ответ от сервера с картинкой в виде массива байт и так обрабатываю через 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
      • Feb. 14, 2022, 10:01 a.m.
      • (edited)

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

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

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

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

        Михаил Сермяжко
        • Feb. 15, 2022, 4:08 a.m.
        • (edited)

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

        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 вызфвается только один раз

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

            Михаил Сермяжко
            • Feb. 15, 2022, 4:58 a.m.

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

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

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

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

                Михаил Сермяжко
                • Feb. 15, 2022, 5:58 a.m.
                • The answer was marked as a solution.

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

                                        imageIrImage.source = "image://imageProviderIRImage/ir"
                                        imageIrImage.source = "image://imageProviderIRImage"
                

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

                    Comments

                    Only authorized users can post comments.
                    Please, Log in or Sign up
                    AD

                    C ++ - Test 004. Pointers, Arrays and Loops

                    • Result:50points,
                    • Rating points-4
                    m

                    C ++ - Test 004. Pointers, Arrays and Loops

                    • Result:80points,
                    • Rating points4
                    m

                    C ++ - Test 004. Pointers, Arrays and Loops

                    • Result:20points,
                    • Rating points-10
                    Last comments
                    Evgenii Legotckoi
                    Evgenii LegotckoiOct. 31, 2024, 2:37 p.m.
                    Django - Lesson 064. How to write a Python Markdown extension Добрый день. Да, можно. Либо через такие же плагины, либо с постобработкой через python библиотеку Beautiful Soup
                    A
                    ALO1ZEOct. 19, 2024, 8:19 a.m.
                    Fb3 file reader on Qt Creator Подскажите как это запустить? Я не шарю в программировании и кодинге. Скачал и установаил Qt, но куча ошибок выдается и не запустить. А очень надо fb3 переконвертировать в html
                    ИМ
                    Игорь МаксимовOct. 5, 2024, 7:51 a.m.
                    Django - Lesson 064. How to write a Python Markdown extension Приветствую Евгений! У меня вопрос. Можно ли вставлять свои классы в разметку редактора markdown? Допустим имея стандартную разметку: <ul> <li></li> <li></l…
                    d
                    dblas5July 5, 2024, 11:02 a.m.
                    QML - Lesson 016. SQLite database and the working with it in QML Qt Здравствуйте, возникает такая проблема (я новичок): ApplicationWindow неизвестный элемент. (М300) для TextField и Button аналогично. Могу предположить, что из-за более новой верси…
                    k
                    kmssrFeb. 8, 2024, 6:43 p.m.
                    Qt Linux - Lesson 001. Autorun Qt application under Linux как сделать автозапуск для флэтпака, который не даёт создавать файлы в ~/.config - вот это вопрос ))
                    Now discuss on the forum
                    Evgenii Legotckoi
                    Evgenii LegotckoiJune 24, 2024, 3:11 p.m.
                    добавить qlineseries в функции Я тут. Работы оень много. Отправил его в бан.
                    t
                    tonypeachey1Nov. 15, 2024, 6:04 a.m.
                    google domain [url=https://google.com/]domain[/url] domain [http://www.example.com link title]
                    NSProject
                    NSProjectJune 4, 2022, 3:49 a.m.
                    Всё ещё разбираюсь с кешем. В следствии прочтения данной статьи. Я принял для себя решение сделать кеширование свойств менеджера модели LikeDislike. И так как установка evileg_core для меня не была возможна, ибо он писался…
                    9
                    9AnonimOct. 25, 2024, 9:10 a.m.
                    Машина тьюринга // Начальное состояние 0 0, ,<,1 // Переход в состояние 1 при пустом символе 0,0,>,0 // Остаемся в состоянии 0, двигаясь вправо при встрече 0 0,1,>…

                    Follow us in social networks