web-dev-qa-db-fra.com

Comment passer l'aperçu de l'image du composant QML Camera à un plugin C ++

J'écris une application Ubuntu Touch QML qui capture et traite les images d'un appareil photo. Le traitement est effectué par un plugin C++ auquel je passe l'URL de l'image.

Je parviens à enregistrer des images et à les charger à partir du plug-in C++, mais je préférerais ne pas avoir à enregistrer d'abord les images sur le système de fichiers et à passer l'aperçu de la caméra en mémoire au plug-in.

Étant donné l'URL de l'aperçu que je reçois de l'appareil photo (image://camera/preview_1), je suppose que je devrais pouvoir obtenir une référence au "camera"fournisseur d'image puis utilisez la méthode requestImage () pour obtenir l'image.

Cependant, je n'ai pas été capable de comprendre comment obtenir le fournisseur d'images camera. Voici le code:

QString Decoder::decodeImageQML(const QUrl &imgUrl)
{
    /* 
     * @imgUrl: URL to the camera preview. E.g. image://camera/preview_1
     */

    QQmlEngine * engine;
    QQuickImageProvider *imageProvider = 0;

    // FIXME: this does not work, I'm not sure how to get hold of 
    // the image provider
    imageProvider = engine->imageProvider("camera");

    QImage image = imageProvider->requestImage(("preview_1", &size, QSize());

    return Decoder::decodeImage(image);
}

Comment obtenir une référence au fournisseur d'images camera?

7
David Planella

Vous pouvez obtenir une instance de moteur valide en utilisant la syntaxe suivante.

QQmlEngine *engine = QQmlEngine::contextForObject(this)->engine();

Et pour obtenir le pointeur du fournisseur d'image, vous pouvez faire quelque chose comme suivre,

QQmlImageProviderBase* imageProviderBase = engine->imageProvider(item.Host());
QQuickImageProvider* imageProvider = static_cast<QQuickImageProvider*>(imageProviderBase);

QQuickImageProvider étant dérivé de QQmlImageProviderBase, je pense que cette distribution est correcte. Vous ne savez pas comment sinon nous pouvons obtenir le pointeur de QQuickImageProvider à partir du moteur.

4
Kunal

Pour obtenir l'aperçu de l'image en C++, vous devez passer la propriété mediaObject de l'élément QML Camera à C++. Vous pouvez voir ce code dans l'application camera à titre d'exemple.

Vous pouvez essayer d'utiliser le QCameraImageCapture avec ce mediaObject. Mais je ne suis pas sûr que cela va marcher. Mais il a le signal imageCaptured dont vous aurez besoin. Cela a un QImage avec l'aperçu.

void AdvancedCamera::setCamera(QObject *cameraObject)
{
    QVariant cameraVariant = cameraObject->property("mediaObject");
    QCamera *camera = qvariant_cast<QCamera*>(cameraVariant);
    QCameraImageCapture *imageCapture = new QCameraImageCapture(camera);
    QObject::connect(imageCapture, SIGNAL(imageCaptured(int, const QImage&))
        myObject, SLOT(processPreview(int, const QImage&)));
}

Si cela ne fonctionne pas, voici une autre solution, en utilisant le QCameraImageCaptureControl du QMediaService :

void AdvancedCamera::setCamera(QObject *cameraObject)
{
    QVariant cameraVariant = cameraObject->property("mediaObject");
    QCamera *camera = qvariant_cast<QCamera*>(cameraVariant);
    QMediaService *service = camera->service();
    QMediaControl *control = service->requestControl(QCameraImageCaptureControl_iid);
    QCameraImageCaptureControl *captureControl = qobject_cast<QCameraImageCaptureControl*>(control);
    QObject::connect(captureControl, SIGNAL(imageCaptured(int, const QImage&))
        myObject, SLOT(processPreview(int, const QImage&)));
}

Vous devriez regarder le code de la camera-app pour un meilleur exemple.

Pour que l'image finale soit livrée sous la forme QVideoFrame en C++, vous devez définir captureDestination. Mais ce n’est pas (encore?) Pris en charge par l’appareil photo des téléphones Ubuntu.

3
Günter Schwann