6#include <mediacapture/qwindowsmediacapture_p.h>
7#include <mediacapture/qwindowsmediadevicesession_p.h>
9#include <QtMultimedia/private/qmediastoragelocation_p.h>
10#include <QtGui/qimagewriter.h>
11#include <QtConcurrent/qtconcurrentrun.h>
15using namespace Qt::StringLiterals;
18 : QPlatformImageCapture(parent)
26 if (!m_mediaDeviceSession)
28 return !m_capturing && m_mediaDeviceSession
->isActive() && !m_mediaDeviceSession->activeCamera().isNull();
33 auto ext = writerFormat(m_settings.format());
34 auto path = QMediaStorageLocation::generateFileName(fileName, QStandardPaths::PicturesLocation, ext);
35 return doCapture(path);
40 return doCapture(QString());
47 m_fileName = fileName;
59 m_settings = settings;
65 if (m_captureService == captureService)
69 if (m_mediaDeviceSession)
70 disconnect(m_mediaDeviceSession,
nullptr,
this,
nullptr);
72 m_captureService = captureService;
73 if (!m_captureService) {
75 emit readyForCaptureChanged(
false);
76 m_mediaDeviceSession =
nullptr;
81 Q_ASSERT(m_mediaDeviceSession);
87 this, &QWindowsImageCapture::readyForCaptureChanged);
89 connect(m_mediaDeviceSession, &QWindowsMediaDeviceSession::videoFrameChanged,
90 this, &QWindowsImageCapture::handleVideoFrameChanged);
97 QImage image = frame.toImage();
99 QSize size = m_settings.resolution();
100 if (size.isValid() && image.size() != size) {
101 image = image.scaled(size, Qt::KeepAspectRatioByExpanding);
102 if (image.size() != size) {
103 int xoff = (image.size().width() - size.width()) / 2;
104 int yoff = (image.size().height() - size.height()) / 2;
105 image = image.copy(xoff, yoff, size.width(), size.height());
109 emit imageExposed(m_captureId);
110 emit imageAvailable(m_captureId, frame);
111 emit imageCaptured(m_captureId, image);
113 QMediaMetaData metaData =
this->metaData();
114 metaData.insert(QMediaMetaData::Date, QDateTime::currentDateTime());
115 metaData.insert(QMediaMetaData::Resolution, size);
117 emit imageMetadataAvailable(m_captureId, metaData);
119 if (!m_fileName.isEmpty()) {
121 (
void)QtConcurrent::run(&QWindowsImageCapture::saveImage,
this,
122 m_captureId, m_fileName, image, metaData, m_settings);
131 const QImage &image,
const QMediaMetaData &metaData,
132 const QImageEncoderSettings &settings)
134 QImageWriter imageWriter;
135 imageWriter.setFileName(fileName);
137 QString format = writerFormat(settings.format());
138 imageWriter.setFormat(format.toUtf8());
140 int quality = writerQuality(format, settings.quality());
142 imageWriter.setQuality(quality);
144 for (
auto key : metaData.keys())
145 imageWriter.setText(QMediaMetaData::metaDataKeyToString(key),
146 metaData.stringValue(key));
148 imageWriter.write(image);
150 QMetaObject::invokeMethod(
this, [
this, captureId, fileName] {
151 emit imageSaved(captureId, fileName);
152 }, Qt::QueuedConnection);
160 case QImageCapture::FileFormat::JPEG:
163 case QImageCapture::FileFormat::PNG:
166 case QImageCapture::FileFormat::WebP:
169 case QImageCapture::FileFormat::Tiff:
176 auto supported = QImageWriter::supportedImageFormats();
177 for (
const auto &f : supported)
178 if (format.compare(QString::fromUtf8(f), Qt::CaseInsensitive) == 0)
185 QImageCapture::Quality quality)
187 if (writerFormat.compare(u"jpg", Qt::CaseInsensitive) == 0 ||
188 writerFormat.compare(u"jpeg", Qt::CaseInsensitive) == 0) {
191 case QImageCapture::Quality::VeryLowQuality:
193 case QImageCapture::Quality::LowQuality:
195 case QImageCapture::Quality::NormalQuality:
197 case QImageCapture::Quality::HighQuality:
199 case QImageCapture::Quality::VeryHighQuality:
210#include "moc_qwindowsimagecapture_p.cpp"
int capture(const QString &fileName) override
virtual ~QWindowsImageCapture()
int captureToBuffer() override
QImageEncoderSettings imageSettings() const override
void setImageSettings(const QImageEncoderSettings &settings) override
void setCaptureSession(QPlatformMediaCaptureSession *session)
bool isReadyForCapture() const override
Combined button and popup list for selecting options.