前言:
本示例在 Qt5.15.2(qml)取出视频帧 原始帧,示例的基础上修改
一、添加工具类
添加一个工具类Tool,用于从文件加载图像文件,头文件如下
#include <QObject>
class Tool : public QObject
{
Q_OBJECT
public:
explicit Tool(QObject *parent = nullptr);
//从文件加载图像文件
Q_INVOKABLE void setCapturedImage(const QString &imageFileName);
signals:
};
源文件关键代码如下
/*!
* \brief Tool::setCapturedImage 从文件加载图像文件
* \param imageFileName 文件全名
*/
void Tool::setCapturedImage(const QString &imageFileName)
{
QImage image;
image.load(imageFileName);
//将视频帧放入图像提供者
ImageProvider::setImage(image);
}
在main()函数中,将Tool注册到qml中
qmlRegisterType<Tool>("com.xdqd.classes", 1, 0, "Tool");
二、修改UI显示
如下所示,是笔者修改的UI
增加一个Label,用于显示已从C++加载的图像;再增加一个拍照的按钮
修改qml文件,关键代码如下
Tool {
id: tool
}
Connections {
target: button_capture
function onClicked() {
console.debug("button_capture onClicked")
camera.imageCapture.capture();//文件保存到默认目录
//camera.imageCapture.captureToLocation();//文件保存到指定目录
}
}
Connections {
target: camera.imageCapture
function onCaptureFailed(requestId, message) {//捕获图像出错
console.debug("onImageCaptured",requestId,message)
}
function onImageCaptured(requestId, preview) {//已捕获图像的url
// Show the preview in an Image
console.debug("onImageCaptured",requestId,preview)
image.source = preview
}
function onImageSaved(requestId, path) {//已捕获图像的文件名
console.debug("onImageSaved",requestId,path)
tool.setCapturedImage(path)
//必须要更换下,否则图像不会发生变化
image2.source = "image://imageProvider/0"
image2.source = "image://imageProvider/1"
}
}
注意:
(1)camera.imageCapture.capture()
截取的图像就放在系统默认的图像文件目录中,win10下是图片目录
camera.imageCapture.captureToLocation();
截取的图像就放在指定目录
(3)用完截图后,一定要记得删除,否则会越来越多
添加完成后,就可以运行程序了,以下是笔者的运行结果
本次教程的示例源码
后记:
Qt5的每一次拍照,都会生成一个图片文件,需要小伙伴自己删除,Android上也不例外。
时间所限,笔者只在win10、Android上测试了下,其他操作系统没测试,请小伙伴自己测试
Android上的默认目录无法直接从文件管理中访问,建议直接指定SD的目录
Qt6的示例也写完了,今天有点困了,明天再上传好了