QT可以直接调用本地摄像头,同时可以进行截图。用到如下三个类
- QCamera:物理摄像头
- QCameraViewfinder:摄像头取景器
- QCameraImageCapture:截图工具
最终效果如下所示
下面来介绍上述功能的实现过程
首先在.pro文件中添加如下内容
QT += multimedia
QT += multimediawidgets
编写.h文件
#ifndef WIDGET_H
#define WIDGET_H
#include <QWidget>
class QLabel;
class QCameraImageCapture;
class QCameraViewfinder;
class QCamera;
class Widget : public QWidget
{
Q_OBJECT
public:
Widget(QWidget *parent = 0);
~Widget();
public slots:
void capture_image();
void display_image(int id, QImage image);
void save_image();
private:
QLabel * image_captured;
QCameraImageCapture * image_capturer;
QCameraViewfinder * viewfinder;
QCamera * camera;
};
#endif // WIDGET_H
编写.c文件
#include "widget.h"
#include "QCamera"
#include "QCameraViewfinder"
#include "QCameraImageCapture"
#include "QHBoxLayout"
#include "QGridLayout"
#include "QPushButton"
#include "QLabel"
#include "QVBoxLayout"
#include "QHBoxLayout"
#include "QDir"
#include "QFileDialog"
Widget::Widget(QWidget *parent)
: QWidget(parent)
{
camera = new QCamera(this);
camera->setCaptureMode(QCamera::CaptureStillImage);
//摄像头调用器
viewfinder=new QCameraViewfinder(this);
viewfinder->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding);
//视频观察窗口
image_capturer=new QCameraImageCapture(camera);
image_capturer->setCaptureDestination(QCameraImageCapture::CaptureToFile);
//截图工具
image_captured = new QLabel;
image_captured->setFixedSize(300, 300);
image_captured->setSizePolicy(QSizePolicy::Fixed, QSizePolicy::Fixed);
image_captured->setScaledContents(true);
//截图显示
QPushButton * capture_btn = new QPushButton("截图");
capture_btn->setSizePolicy(QSizePolicy::Minimum, QSizePolicy::Minimum);
//截图按钮
QPushButton * save_btn = new QPushButton("保存");
save_btn->setSizePolicy(QSizePolicy::Minimum, QSizePolicy::Minimum);
//保存按钮
QVBoxLayout *vlayout = new QVBoxLayout();
vlayout->addWidget(image_captured);
vlayout->addStretch();
vlayout->addWidget(save_btn);
vlayout->addWidget(capture_btn);
//工具栏布局
camera->setViewfinder(viewfinder);
camera->start();
//开始拍摄
QHBoxLayout * layout = new QHBoxLayout();
layout->addWidget(viewfinder);
layout->addLayout(vlayout);
this->setLayout(layout);
//最外层布局
this->resize(1000, 500);
connect(capture_btn, &QPushButton::clicked , this, &Widget::capture_image );
connect(image_capturer, &QCameraImageCapture::imageCaptured, this, &Widget::display_image);
connect(save_btn, &QPushButton::clicked, this, &Widget::save_image);
}
Widget::~Widget()
{
}
void Widget::capture_image()
{
image_capturer->capture();
}
void Widget::display_image(int id, QImage image)
{
image_captured->setPixmap(QPixmap::fromImage(image));
}
void Widget::save_image()
{
QString fileName = QFileDialog::getSaveFileName(this, QString::fromLocal8Bit("Save picture"),
QDir::currentPath(),
tr("Images (*.png *.xpm *.jpg)"));
const QPixmap *pixmap = image_captured->pixmap();
if(pixmap)
{
pixmap->save(fileName);
}
}
大功告成