如何将图像预览从 QML 相机组件传递给 C++ 插件

Dav*_*lla 7 qt c++ application-development qml ubuntu-touch

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

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

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

但是,我一直无法弄清楚如何获得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);
}
Run Code Online (Sandbox Code Playgroud)

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

小智 4

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

QQmlEngine *engine = QQmlEngine::contextForObject(this)->engine();
Run Code Online (Sandbox Code Playgroud)

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

QQmlImageProviderBase* imageProviderBase = engine->imageProvider(item.host());
QQuickImageProvider* imageProvider = static_cast<QQuickImageProvider*>(imageProviderBase);
Run Code Online (Sandbox Code Playgroud)

由于 QQuickImageProvider 是从 QQmlImageProviderBase 派生的,我认为这个转换是可以的。不知道如何才能从引擎获取 QQuickImageProvider 的指针。