Начнём с написания класса ImageProcessor
, который мы будем использовать в качестве модуля QML.
Ниже приведён файл заголовка ImageProcessor
, в нём определён слот processImage()
, который может быть вызван из QML кода.
#ifndef IMAGEPROCESSOR_H #define IMAGEPROCESSOR_H #include <QObject> class ImageProcessor : public QObject { Q_OBJECT public: explicit ImageProcessor(QObject *parent = 0); public slots: void processImage(const QString& image); }; #endif // IMAGEPROCESSOR_H
Далее приведёна реализация класса ImageProcessor
. Функция processImage()
принимает изображение от поставщика изображений (image provider). Как только в неё будет передано валидое изображение, мы сможем каким-либо образом обработать его.
#include "imageprocessor.h" #include <QtQml/QmlEngine> #include <QtQml/QmlContext> #include <QtQuick/QQuickImageProvider> #include <QDebug> ImageProcessor::ImageProcessor(QObject *parent) : QObject(parent) {} void ImageProcessor::processImage(const QString& path) { QUrl imageUrl(path); QQmlEngine* engine = QQmlEngine::contextForObject(this)->engine(); QQmlImageProviderBase* imageProviderBase = engine->imageProvider( imageUrl.host()); QQuickImageProvider* imageProvider = static_cast<QQuickImageProvider> (imageProviderBase); QSize imageSize; QString imageId = imageUrl.path().remove(0,1); QImage image = imageProvider->requestImage(imageId, &imageSize, imageSize); if( !image.isNull()) { // обработка изображения } }
Теперь нам нужно зарегистрировать класс ImageProvider
для того, чтобы мы могли использовать его в QML коде. Сделать это можно с помощью глобальной функции qmlRegisterType
.
#include <QtGui/QGuiApplication> #include <QQmlEngine> #include <QQmlComponent> #include <QtQuick/QQuickView> #include "imageprocessor.h" int main(int argc, char *argv[]) { qmlRegisterType<ImageProcessor>("ImageProcessor", 1, 0, "ImageProcessor"); QGuiApplication app(argc, argv); QQuickView view; QObject::connect(view.engine(),SIGNAL(quit()),&app,SLOT(quit())); view.setSource(QUrl::fromLocalFile("qml/main.qml")); view.show(); return app.exec(); }
Всё, на этом с C++ частью покончено. Далее вы можете увидеть демонстрацию использования данного компонента.
import QtQuick 2.0 import QtMultimedia 5.0 import ImageProcessor 1.0 Rectangle { width: 360 height: 360 // отображает live-поток с камеры VideoOutput { source: camera anchors.fill: parent focus : visible } // отображает захваченный кадр Image { id: photoPreview anchors.fill: parent fillMode: Image.PreserveAspectFit } Camera { id: camera imageProcessing.whiteBalanceMode: CameraImageProcessing.WhiteBalanceFlash captureMode: Camera.CaptureStillImage exposure { exposureCompensation: -1.0 exposureMode: Camera.ExposurePortrait } flash.mode: Camera.FlashRedEyeReduction imageCapture { onImageCaptured: { photoPreview.source = preview imageProcessor.processImage(preview); } } } MouseArea{ anchors.fill: parent onClicked: { camera.imageCapture.capture(); } } ImageProcessor{ id: imageProcessor } }
Спасибо за внимание.
ссылка на оригинал статьи http://habrahabr.ru/post/182658/
Добавить комментарий