Ich schreibe eine Ubuntu Touch QML-App, die Bilder von einem Kameragerät erfasst und verarbeitet. Die Verarbeitung erfolgt über ein C ++ - Plugin, an das ich die URL des Bildes übergebe.
Ich kann Bilder erfolgreich speichern und vom C ++ - Plugin laden, aber ich muss die Bilder lieber nicht zuerst im Dateisystem speichern und stattdessen die Vorschau der In-Memory-Kamera an das Plugin übergeben.
Die URL für die Vorschau Da ich von der Kamera (bin immer image://camera/preview_1
), ich vermute , ich soll in der Lage einen Verweis auf das bekommen "camera"
Bildanbieter und dann die Verwendung requestImage () Methode um das Bild zu bekommen.
Ich konnte jedoch nicht herausfinden, wie ich an den camera
Bildanbieter gelangen kann. Hier ist der 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);
}
Wie erhalte ich einen Verweis auf den camera
Bildanbieter?
quelle
Antworten:
Sie können eine gültige Engine-Instanz mit der folgenden Syntax abrufen.
Und um den Zeiger des Bildanbieters zu erhalten, können Sie Folgendes tun:
Da QQuickImageProvider von QQmlImageProviderBase abgeleitet ist, denke ich, dass diese Besetzung in Ordnung ist. Ich bin mir nicht sicher, wie wir sonst den Zeiger von QQuickImageProvider von der Engine erhalten können.
quelle
Um das Vorschaubild in C ++ zu erhalten, sollten Sie die mediaObject- Eigenschaft des QML Camera-Elements an C ++ übergeben. Sie können diesen Code in der Kamera-App als Beispiel sehen.
Sie könnten versuchen, QCameraImageCapture damit zu verwenden
mediaObject
. Aber ich bin mir nicht sicher, ob das funktionieren wird. Aber es hat das imageCaptured-Signal, das Sie benötigen. Das hat ein QImage mit der Vorschau.Wenn es nicht funktioniert, können Sie das QCameraImageCaptureControl des QMediaService auf folgende Weise verwenden :
Ein besseres Beispiel finden Sie im Code der Kamera-App .
Um das endgültige Image als QVideoFrame in C ++ zu erhalten, müssen Sie die CaptureDestination festlegen. Aber das wird (noch?) Vom Kamera-Backend der Ubuntu-Handys nicht unterstützt.
quelle