如何将图像预览从 QML Camera 组件传递到 C++ 插件

如何将图像预览从 QML Camera 组件传递到 C++ 插件

我正在编写一个 Ubuntu Touch QML 应用,用于捕获和处理来自相机设备的图像。处理由一个 C++ 插件完成,我将图像的 URL 传递给该插件。

我可以成功保存图像并从 C++ 插件加载它们,但我不想先将图像保存在文件系统上,而是将内存中的相机预览传递给插件。

鉴于我从相机获取的预览 URL ( image://camera/preview_1),我猜我应该能够获得对"camera" 图片提供者然后使用请求图像()方法来获取图像。

但是,我还没搞清楚如何获取camera图片提供者。代码如下:

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);
}

如何获取camera图像提供者的引用?

答案1

您可以使用以下语法获取有效的引擎实例。

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

要获取图像提供者的指针,您可以执行以下操作,

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

由于 QQuickImageProvider 是从 QQmlImageProviderBase 派生的,我认为这种转换是可以的。不确定我们怎样才能从引擎获取 QQuickImageProvider 的指针。

答案2

要在 C++ 中获取预览图像,您应该传递媒体对象将 QML Camera 元素的属性转换为 C++。您可以看到相机应用程序中的代码作为示例。

您可以尝试使用QCameraImageCapture有了它mediaObject。但我不确定这是否可行。但它有你需要的 imageCaptured 信号。它有一个图像处理带有预览。

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&)));
}

如果不起作用,还有另一种方法,使用QCameraImageCaptureControl媒体服务

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&)));
}

你应该看看相机应用程序以获得更好的例子。

为了获得最终的图像QVideoFrame在 C++ 中,您需要设置 captureDestination。但 Ubuntu 手机的相机后端尚不支持此功能。

相关内容