Qt
Internal/Contributor docs for the Qt SDK. <b>Note:</b> These are NOT official API docs; those are found <a href='https://doc.qt.io/'>here</a>.
Loading...
Searching...
No Matches
qwindowsimagecapture.cpp
Go to the documentation of this file.
1// Copyright (C) 2021 The Qt Company Ltd.
2// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
3
5
8#include <private/qmediastoragelocation_p.h>
9
10#include <QtConcurrent/qtconcurrentrun.h>
11#include <QtGui/qimagewriter.h>
12
14
19
21
23{
24 if (!m_mediaDeviceSession)
25 return false;
26 return !m_capturing && m_mediaDeviceSession->isActive() && !m_mediaDeviceSession->activeCamera().isNull();
27}
28
30{
31 auto ext = writerFormat(m_settings.format());
33 return doCapture(path);
34}
35
37{
38 return doCapture(QString());
39}
40
41int QWindowsImageCapture::doCapture(const QString &fileName)
42{
43 if (!isReadyForCapture())
44 return -1;
45 m_fileName = fileName;
46 m_capturing = true;
47 return m_captureId;
48}
49
51{
52 return m_settings;
53}
54
59
61{
62 QWindowsMediaCaptureService *captureService = static_cast<QWindowsMediaCaptureService *>(session);
63 if (m_captureService == captureService)
64 return;
65
66 auto readyForCapture = isReadyForCapture();
67 if (m_mediaDeviceSession)
68 disconnect(m_mediaDeviceSession, nullptr, this, nullptr);
69
70 m_captureService = captureService;
71 if (!m_captureService) {
72 if (readyForCapture)
74 m_mediaDeviceSession = nullptr;
75 return;
76 }
77
78 m_mediaDeviceSession = m_captureService->session();
79 Q_ASSERT(m_mediaDeviceSession);
80
81 if (isReadyForCapture() != readyForCapture)
83
86
88 this, &QWindowsImageCapture::handleVideoFrameChanged);
89}
90
91void QWindowsImageCapture::handleVideoFrameChanged(const QVideoFrame &frame)
92{
93 if (m_capturing) {
94
95 QImage image = frame.toImage();
96
97 QSize size = m_settings.resolution();
98 if (size.isValid() && image.size() != size) {
100 if (image.size() != size) {
101 int xoff = (image.size().width() - size.width()) / 2;
102 int yoff = (image.size().height() - size.height()) / 2;
103 image = image.copy(xoff, yoff, size.width(), size.height());
104 }
105 }
106
107 emit imageExposed(m_captureId);
108 emit imageAvailable(m_captureId, frame);
109 emit imageCaptured(m_captureId, image);
110
114
116
117 if (!m_fileName.isEmpty()) {
118
119 (void)QtConcurrent::run(&QWindowsImageCapture::saveImage, this,
120 m_captureId, m_fileName, image, metaData, m_settings);
121 }
122
123 ++m_captureId;
124 m_capturing = false;
125 }
126}
127
128void QWindowsImageCapture::saveImage(int captureId, const QString &fileName,
129 const QImage &image, const QMediaMetaData &metaData,
131{
132 QImageWriter imageWriter;
133 imageWriter.setFileName(fileName);
134
135 QString format = writerFormat(settings.format());
136 imageWriter.setFormat(format.toUtf8());
137
138 int quality = writerQuality(format, settings.quality());
139 if (quality > -1)
140 imageWriter.setQuality(quality);
141
142 for (auto key : metaData.keys())
143 imageWriter.setText(QMediaMetaData::metaDataKeyToString(key),
144 metaData.stringValue(key));
145
146 imageWriter.write(image);
147
149 Q_ARG(int, captureId), Q_ARG(QString, fileName));
150}
151
152QString QWindowsImageCapture::writerFormat(QImageCapture::FileFormat reqFormat)
153{
155
156 switch (reqFormat) {
158 format = QLatin1String("jpg");
159 break;
161 format = QLatin1String("png");
162 break;
164 format = QLatin1String("webp");
165 break;
167 format = QLatin1String("tiff");
168 break;
169 default:
170 format = QLatin1String("jpg");
171 }
172
173 auto supported = QImageWriter::supportedImageFormats();
174 for (const auto &f : supported)
177
178 return QLatin1String("jpg");
179}
180
181int QWindowsImageCapture::writerQuality(const QString &writerFormat,
183{
184 if (writerFormat.compare(QLatin1String("jpg"), Qt::CaseInsensitive) == 0 ||
185 writerFormat.compare(QLatin1String("jpeg"), Qt::CaseInsensitive) == 0) {
186
187 switch (quality) {
189 return 10;
191 return 30;
193 return 75;
195 return 90;
197 return 98;
198 default:
199 return 75;
200 }
201 }
202 return -1;
203}
204
206
207#include "moc_qwindowsimagecapture_p.cpp"
bool isNull() const
Returns true if this QCameraDevice is null or invalid.
static QDateTime currentDateTime()
This is an overloaded member function, provided for convenience. It differs from the above function o...
\inmodule QtMultimedia
FileFormat
Choose one of the following image formats:
Quality
Enumerates quality encoding levels.
QImageCapture::FileFormat format() const
The QImageWriter class provides a format independent interface for writing images to files or other d...
void setFileName(const QString &fileName)
Sets the file name of QImageWriter to fileName.
static QList< QByteArray > supportedImageFormats()
Returns the list of image formats supported by QImageWriter.
\inmodule QtGui
Definition qimage.h:37
\inmodule QtMultimedia
Q_INVOKABLE void insert(Key k, const QVariant &value)
\qmlmethod void QtMultimedia::mediaMetaData::insert(Key k, variant value) Inserts a value into a Key:...
static QMetaObject::Connection connect(const QObject *sender, const char *signal, const QObject *receiver, const char *member, Qt::ConnectionType=Qt::AutoConnection)
\threadsafe
Definition qobject.cpp:2960
void imageCaptured(int requestId, const QImage &preview)
QMediaMetaData metaData() const
void imageAvailable(int requestId, const QVideoFrame &buffer)
void imageMetadataAvailable(int id, const QMediaMetaData &)
void imageExposed(int requestId)
void readyForCaptureChanged(bool ready)
Format format() const
\inmodule QtCore
Definition qsize.h:25
\macro QT_RESTRICTED_CAST_FROM_ASCII
Definition qstring.h:129
bool isEmpty() const noexcept
Returns true if the string has no characters; otherwise returns false.
Definition qstring.h:192
int compare(const QString &s, Qt::CaseSensitivity cs=Qt::CaseSensitive) const noexcept
Definition qstring.cpp:6664
The QVideoFrame class represents a frame of video data.
Definition qvideoframe.h:27
int capture(const QString &fileName) override
virtual ~QWindowsImageCapture()
QWindowsImageCapture(QImageCapture *parent)
QImageEncoderSettings imageSettings() const override
void setImageSettings(const QImageEncoderSettings &settings) override
void setCaptureSession(QPlatformMediaCaptureSession *session)
bool isReadyForCapture() const override
QWindowsMediaDeviceSession * session() const
void videoFrameChanged(const QVideoFrame &frame)
Q_MULTIMEDIA_EXPORT QString generateFileName(const QString &requestedName, QStandardPaths::StandardLocation type, const QString &extension)
Combined button and popup list for selecting options.
qsizetype fromUtf8(uchar b, OutputPtr &dst, InputPtr &src, InputPtr end)
QTCONCURRENT_RUN_NODISCARD auto run(QThreadPool *pool, Function &&f, Args &&...args)
Definition qcompare.h:63
@ KeepAspectRatioByExpanding
@ CaseInsensitive
@ QueuedConnection
Definition image.cpp:4
DBusConnection const char DBusError DBusBusType DBusError return DBusConnection DBusHandleMessageFunction void DBusFreeFunction return DBusConnection return DBusConnection return const char DBusError return DBusConnection DBusMessage dbus_uint32_t return DBusConnection dbus_bool_t DBusConnection DBusAddWatchFunction DBusRemoveWatchFunction DBusWatchToggledFunction void DBusFreeFunction return DBusConnection DBusDispatchStatusFunction void DBusFreeFunction DBusTimeout return DBusTimeout return DBusWatch return DBusWatch unsigned int return DBusError const DBusError return const DBusMessage return DBusMessage return DBusMessage return DBusMessage return DBusMessage return DBusMessage return DBusMessageIter int const void return DBusMessageIter DBusMessageIter return DBusMessageIter void DBusMessageIter void int return DBusMessage DBusMessageIter return DBusMessageIter return DBusMessageIter DBusMessageIter const char const char const char const char return DBusMessage return DBusMessage const char return DBusMessage dbus_bool_t return DBusMessage dbus_uint32_t return DBusMessage void
#define Q_ARG(Type, data)
Definition qobjectdefs.h:63
GLuint64 key
GLenum GLuint GLintptr GLsizeiptr size
[1]
GLfloat GLfloat f
GLint GLsizei GLsizei GLenum format
GLsizei const GLchar *const * path
#define Q_ASSERT(cond)
Definition qrandom.cpp:47
QLatin1StringView QLatin1String
Definition qstringfwd.h:31
#define emit
static int compare(quint64 a, quint64 b)
if(qFloatDistance(a, b)<(1<< 7))
[0]
QSettings settings("MySoft", "Star Runner")
[0]
QStringList keys
myObject disconnect()
[26]
QFrame frame
[0]
insertRed setText("insert red text")
static bool invokeMethod(QObject *obj, const char *member, Qt::ConnectionType, QGenericReturnArgument ret, QGenericArgument val0=QGenericArgument(nullptr), QGenericArgument val1=QGenericArgument(), QGenericArgument val2=QGenericArgument(), QGenericArgument val3=QGenericArgument(), QGenericArgument val4=QGenericArgument(), QGenericArgument val5=QGenericArgument(), QGenericArgument val6=QGenericArgument(), QGenericArgument val7=QGenericArgument(), QGenericArgument val8=QGenericArgument(), QGenericArgument val9=QGenericArgument())
\threadsafe This is an overloaded member function, provided for convenience. It differs from the abov...