我正在编写一个 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 手机的相机后端尚不支持此功能。