卡顿原因:
QCameraImageCapture每次调用capture,无论你是否输入路径,都会将捕获的图片存盘,存盘的速度慢导致卡顿。
解决思路:
将捕获的图片输出到内存缓冲区而不存盘
具体操作:
1、确保支持输出到缓冲区
isCaptureDestinationSupported(QCameraImageCapture::CaptureToBuffer)
2、设置截图输出、缓冲区格式、分辨率
image_capture_->setCaptureDestination(QCameraImageCapture::CaptureToBuffer);
image_capture_->setBufferFormat(QVideoFrame::PixelFormat::Format_Jpeg);
QImageEncoderSettings iamge_setting;
iamge_setting.setResolution(640,360);
image_capture_->setEncodingSettings(iamge_setting);
3、开始截图,通过imageCaptured信号获取图像数据
关键代码如下:
WidgetCamera::WidgetCamera(QWidget *parent) :
QWidget(parent)
{
ui_ = new UI::WidgetCamera(this);
camera_pc_ = new QCamera(this);
camera_pc_->setViewfinder(ui_->getViewFinderOri());
camera_pc_->setCaptureMode(QCamera::CaptureStillImage);
camera_pc_->start();
image_capture_ = new QCameraImageCapture(camera_pc_);
if (image_capture_->isCaptureDestinationSupported(QCameraImageCapture::CaptureToBuffer)) {
image_capture_->setCaptureDestination(QCameraImageCapture::CaptureToBuffer);
qDebug() << image_capture_->supportedBufferFormats();
image_capture_->setBufferFormat(QVideoFrame::PixelFormat::Format_Jpeg);
qDebug() << image_capture_->supportedResolutions(image_capture_->encodingSettings());
QImageEncoderSettings iamge_setting;
iamge_setting.setResolution(640,360);
image_capture_->setEncodingSettings(iamge_setting);
connect(image_capture_,&QCameraImageCapture::imageCaptured,this,&WidgetAiCamera::processCapturedImage);
}
timer_image_capture_ = new QTimer(this);
connect(timer_image_capture_,&QTimer::timeout,this,&WidgetAiCamera::captureImage);
timer_image_capture_->start(90);
}
void WidgetCamera::captureImage()
{
image_capture_->capture();
}
void WidgetCamera::processCapturedImage(int request_id, const QImage &img)
{
qDebug() << "processCapturedImage" << request_id;
ui_->setQImage(img);
}
注意:如果要连续截图,最好不要用计时器,可以在processCapturedImage中处理完图片再次调用capture()
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)