Форум программистов, компьютерный форум, киберфорум
C++ Qt
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.75/4: Рейтинг темы: голосов - 4, средняя оценка - 4.75
0 / 0 / 0
Регистрация: 07.05.2021
Сообщений: 6

Обработка изображений qml

06.05.2023, 13:33. Показов 979. Ответов 1

Студворк — интернет-сервис помощи студентам
Добрый день. У меня есть изображение в формате jpg, которое хранится в директории на моём компьютере. Я это изображение отображаю в объекте Image qml, передавая в поле source путь к этому изображению. И у меня есть класс на c++, который должен обрабатывать это изображение в оттенки серого, к примеру. В этом классе есть функция, которая принимает путь к этому изображению. Как мне в этой функции изменить своё изображение и обновить его в Image qml по нажатию на это изображение?

P.S. Данный код ошибок не вызывает, но и изображение он не обновляет.

Заголовочный файл:
C++ (Qt)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
#ifndef IMAGEPROCESSING_H
#define IMAGEPROCESSING_H
 
#include <QObject>
#include <QImage>
#include <QDebug>
#include <QString>
#include <QQuickImageProvider>
 
class ImageProcessing : public QObject {
    Q_OBJECT
public:
    explicit ImageProcessing(QObject *parent = nullptr);
    Q_INVOKABLE void help(QString path);
 
private:
    QImage image;
 
public slots:
    void processImage(const QString &imagePath);
 
signals:
    void imageChanged(QImage& originalImage);
};
 
#endif // IMAGEPROCESSING_H
Файл с реализацией класса ImageProcessing:
C++ (Qt)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
#include "ImageProcessing.h"
 
ImageProcessing::ImageProcessing(QObject *parent) : QObject(parent){
 
}
 
void ImageProcessing::help(QString path) {
    // Загрузить изображение в объект QImage
       QImage originalImage(path);
 
       // Выполнить преобразование в оттенки серого
       QImage grayImage = originalImage.convertToFormat(QImage::Format_Grayscale8);
 
       // Сохранить изменения в том же объекте QImage
       originalImage = grayImage;
       for (int i = 0; i < originalImage.width(); i++) {
           for (int j = 0; j < originalImage.height(); j++) {
               originalImage.setPixel(i, j, 50);
           }
       }
       // Обновить изображение в объекте Image qml
       emit imageChanged(originalImage);
 
}
 
void ImageProcessing::processImage(const QString &imagePath) {
    //QImage image = qobject_cast<QImage>(imageObject->parent());
 
    QImage img(imagePath, "jpg");
 
    //QImage img = qvariant_cast<QImage>(imageObject.);
 
    qDebug() << img.isNull();
 
    qDebug() << img.width() << " x " << img.height();
    QImage newImage(img.width(), img.height(), img.format());
    for (int i = 0; i < newImage.width(); i++) {
        for (int j = 0; j < newImage.height(); j++) {
            img.setPixel(i, j, 50);
        }
    }
    bool flag = newImage.save("C:\\StorageQt\\harbour-untitled\\qml\\pages\\test.jpg", "JPG");
    qDebug()<<flag;
    //imageObject->setProperty("sourceImage", QVariant::fromValue(image));
}
main.cpp:
C++ (Qt)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#include <QtQuick>
#include <sailfishapp.h>
#include "ImageProcessing.h"
 
int main(int argc, char *argv[]) {
    const QMetaObject meta = ImageProcessing::staticMetaObject;
    QObject *obj = meta.newInstance();
    QObject::connect(obj, SIGNAL(imageChanged(QImage&originalImage)), obj, SLOT(processImage(QString&imagePath)));
    meta.invokeMethod(obj, "help", Q_ARG(QString, ""));
 
    QGuiApplication *app = SailfishApp::application(argc, argv);
    QQuickView *view = SailfishApp::createView();
    view->setSource(SailfishApp::pathTo("qml/harbour-untitled.qml"));
    qmlRegisterType<ImageProcessing>("harbour.appname.ImageProcessing", 1, 0, "ImageProcessing");
    view->showFullScreen();
    return app->exec();
}
Основная QML страница:
Code
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
import QtQuick 2.5
import Sailfish.Silica 1.0
import harbour.appname.ImageProcessing 1.0
 
Page {
    id: page
 
    Item {
        width: page.width
        height: page.height
 
        Image {
            id: myImage
            property var path: ":/qml/pages/test.jpg"
            source: path.replace(":/qml/pages/", "")
            //source: "test.jpg"
            anchors.fill: parent
            fillMode: Image.PreserveAspectFit
 
        }
 
        ImageProcessing {
            id: processor
 
        }
 
 
        MouseArea {
            anchors.fill: parent
            onClicked: {
                processor.help(myImage.path)
            }
        }
    }
 
 
}
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
06.05.2023, 13:33
Ответы с готовыми решениями:

Организация импорта изображений в qml
Доброго времени суток! Недавно начал изучать qt и qml собственно. Столкнулся с проблемой такого характера: Можно ли...

Низкочастотная фильтрация изображений (книга Гонсалеса “Цифровая обработка изображений”)
Здравствуйте. Я пытаюсь реализовать на java низкочастотную фильтрацию изображений. Реализую по книге Гонсалеса &quot;Цифровая...

Обработка изображений. Изменение размеров изображений
Подскажите пожалуйста, как изменить размер изображения в MathCad. Какой код нужен для уменьшения/увеличения изображения?

1
Эксперт .NET
 Аватар для insite2012
5548 / 4311 / 1218
Регистрация: 12.10.2013
Сообщений: 12,371
Записей в блоге: 2
06.05.2023, 15:57
AlexLexal0l, как то у вас много кода для такой простой задачи. Вот ниже пример, который по нажатию кнопки в Image Qml в зависимости от кнопки (правая или левая) показывает то или иное изображение. Можете по этому образцу и сделать, только обработку изображения прикрутите.
C++ (Qt)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#ifndef IMAGEPROCESSOR_H
#define IMAGEPROCESSOR_H
 
#include <QObject>
 
class ImageProcessor : public QObject
{
    Q_OBJECT
public:
    explicit ImageProcessor(QObject *parent = nullptr);
    Q_INVOKABLE
    void get_image_path(int arg);
 
signals:
    void signal_image_path(const QString& path);
 
};
 
#endif // IMAGEPROCESSOR_H
C++ (Qt)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#include "ImageProcessor.h"
 
ImageProcessor::ImageProcessor(QObject *parent) : QObject(parent)
{
 
}
 
void ImageProcessor::get_image_path(int arg)
{
    if(arg){
        const QString& image_path {"qrc:/icons/1.jpg"};
        emit signal_image_path(image_path);
    }
    else{
        const QString& image_path {"qrc:/icons/2.jpg"};
        emit signal_image_path(image_path);
    }
}
C++ (Qt)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
import QtQuick 2.12
import QtQuick.Window 2.12
import QtQuick.Controls 2.12
 
Window {
    width: 640
    height: 480
    visible: true
    title: qsTr("Hello World")
 
    Image{
        id: img;
        anchors.fill: parent;
        autoTransform: true;
        MouseArea{
            anchors.fill: parent;
            acceptedButtons: Qt.LeftButton|Qt.RightButton;
            onClicked: {
                if(mouse.button==Qt.LeftButton){
                    ImageProcessor.get_image_path(0);
                }
                else if(mouse.button==Qt.RightButton){
                    ImageProcessor.get_image_path(1);
                }
            }
        }
    }
    Connections{
        target: ImageProcessor;
        function onSignal_image_path(path){
            img.source=path;
        }
    }
}
C++ (Qt)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
#include <QGuiApplication>
#include <QQmlApplicationEngine>
#include <QQmlContext>
#include <QSharedPointer>
 
#include "ImageProcessor.h"
 
QSharedPointer<ImageProcessor> processor_ptr_ {nullptr};
 
int main(int argc, char *argv[])
{
#if QT_VERSION < QT_VERSION_CHECK(6, 0, 0)
    QCoreApplication::setAttribute(Qt::AA_EnableHighDpiScaling);
#endif
    processor_ptr_.reset(new ImageProcessor);
 
    QGuiApplication app(argc, argv);
 
    QQmlApplicationEngine engine;
    const QUrl url(QStringLiteral("qrc:/main.qml"));
    QObject::connect(&engine, &QQmlApplicationEngine::objectCreated,
                     &app, [url](QObject *obj, const QUrl &objUrl) {
        if (!obj && url == objUrl)
            QCoreApplication::exit(-1);
    }, Qt::QueuedConnection);
    QQmlContext* ctx_ptr {engine.rootContext()};
    ctx_ptr->setContextProperty("ImageProcessor", processor_ptr_.get());
    engine.load(url);
 
    return app.exec();
}
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
06.05.2023, 15:57
Помогаю со студенческими работами здесь

QML TableView. Обработка данных - C++ Qt
Всем доброго времени суток. У меня есть QML TableView, я выбираю из под c++ в QFileDialog файлы, и мне нужно передать данные о них в...

QML обработка события из SerialPort
Добрый день, подскажите как реализовать обработку события в QML (или в крайнем случае не в QML) для получения сигнала с serialport? ...

QML обработка нажатия мыши
День добрый. Возникла задача работать с qml. До этого с ним не сталкивался. Задача простая как тапочек, но видно лыжи не едут :( Есть...

Подсветка QML элементов QML-ного плагина в QtCreator в случае нахождения QML файлов плагина в ресурсах!
Здравствуйте! Если сделать плагин для QML и подключить его в основном проекте ну как - то так: import MiracleStudio.SkyControls 1.0 ...

QML обработка события нажатия мыши
Rectangle{ color:&quot;red&quot; id:rectanglered anchors.fill: parent MouseArea{ anchors.fill: parent ...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
2
Ответ Создать тему
Новые блоги и статьи
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
Фото: Daniel Greenwood
kumehtar 13.11.2025
Расскажи мне о Мире, бродяга
kumehtar 12.11.2025
— Расскажи мне о Мире, бродяга, Ты же видел моря и метели. Как сменялись короны и стяги, Как эпохи стрелою летели. - Этот мир — это крылья и горы, Снег и пламя, любовь и тревоги, И бескрайние. . .
PowerShell Snippets
iNNOKENTIY21 11.11.2025
Модуль PowerShell 5. 1+ : Snippets. psm1 У меня модуль расположен в пользовательской папке модулей, по умолчанию: \Documents\WindowsPowerShell\Modules\Snippets\ А в самом низу файла-профиля. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru