Qt
Internal/Contributor docs for the Qt SDK. Note: These are NOT official API docs; those are found at https://doc.qt.io/
Loading...
Searching...
No Matches
qwasmimagecapture.cpp
Go to the documentation of this file.
1// Copyright (C) 2022 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
9#include <QtGui/qimagewriter.h>
10#include <QtCore/qdir.h>
11#include <QtCore/private/qstdweb_p.h>
12
13#include <emscripten/val.h>
14
16
17using namespace Qt::Literals;
18
19Q_LOGGING_CATEGORY(qWasmImageCapture, "qt.multimedia.wasm.imagecapture")
20/* TODO
21signals:
22imageExposed
23*/
25
26QWasmImageCapture::~QWasmImageCapture() = default;
27
28int QWasmImageCapture::capture(const QString &fileName)
29{
31 Q_EMIT error(m_lastId, QImageCapture::NotReadyError, msgCameraNotReady());
32 return -1;
33 }
34
35 QString imageFilenName;
36 if (fileName.isEmpty())
37 imageFilenName = QDir::homePath() + u"/image.jpg"_s;
38 else
39 imageFilenName = fileName;
40
41 QImage image = takePicture();
42 if (image.isNull())
43 return -1;
44
45 QImageWriter writer(imageFilenName);
46 // TODO
47 // writer.setQuality(quality);
48 // writer.setFormat("png");
49
50 if (writer.write(image)) {
51 qCDebug(qWasmImageCapture) << Q_FUNC_INFO << "image saved";
52 Q_EMIT imageSaved(m_lastId, fileName);
53 } else {
54 QImageCapture::Error err = (writer.error() == QImageWriter::UnsupportedFormatError)
55 ? QImageCapture::FormatError
56 : QImageCapture::ResourceError;
57
58 Q_EMIT error(m_lastId, err, writer.errorString());
59 }
60
61 return m_lastId;
62}
63
65{
67 Q_EMIT error(m_lastId, QImageCapture::NotReadyError, msgCameraNotReady());
68 return -1;
69 }
70
71 QImage image = takePicture();
72 if (image.isNull())
73 return -1;
74
75 Q_EMIT imageCaptured(m_lastId, image);
76 return m_lastId;
77}
78
79QImage QWasmImageCapture::takePicture()
80{
81 m_lastId++;
82
83 // Try the fast path: grab the current frame and convert via RHI.
84 QVideoFrame thisFrame = m_captureSession->videoSink()->videoFrame();
85 QImage image;
86 if (thisFrame.isValid()) {
87 Q_EMIT imageAvailable(m_lastId, thisFrame);
88 image = thisFrame.toImage();
89 }
90
91 if (image.isNull()) {
92 qCDebug(qWasmImageCapture) << Q_FUNC_INFO << "image capture failed";
93 Q_EMIT error(m_lastId, QImageCapture::ResourceError, QStringLiteral("Capture failed"));
94 return QImage();
95 }
96
97 Q_EMIT imageCaptured(m_lastId, image);
98 if (m_settings.resolution().isValid() && m_settings.resolution() != image.size())
99 image = image.scaled(m_settings.resolution());
100
101 return image;
102}
103
105{
106 return m_isReadyForCapture;
107}
108
110{
111 return m_settings;
112}
113
114void QWasmImageCapture::setImageSettings(const QImageEncoderSettings &settings)
115{
116 m_settings = settings;
117}
118
120{
121 if (m_isReadyForCapture != isReady) {
122 m_isReadyForCapture = isReady;
123 Q_EMIT readyForCaptureChanged(m_isReadyForCapture);
124 }
125}
126
127void QWasmImageCapture::setCaptureSession(QPlatformMediaCaptureSession *session)
128{
129 QWasmMediaCaptureSession *captureSession = static_cast<QWasmMediaCaptureSession *>(session);
130 // nullptr clears
131 if (m_captureSession == captureSession)
132 return;
133
134 if (captureSession) {
135 m_lastId = 0;
136 m_captureSession = captureSession;
137 }
138 m_captureSession = captureSession;
139}
140
141QT_END_NAMESPACE
\inmodule QtMultimedia
QObject * parent
Definition qobject.h:74
int capture(const QString &fileName) override
void setReadyForCapture(bool isReady)
bool isReadyForCapture() const override
void setImageSettings(const QImageEncoderSettings &settings) override
void setCaptureSession(QPlatformMediaCaptureSession *session)
QImageEncoderSettings imageSettings() const override
int captureToBuffer() override
Combined button and popup list for selecting options.
Q_LOGGING_CATEGORY(lcEventDispatcher, "qt.eventdispatcher")