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
9
10#include <QtGui/qimagewriter.h>
11#include <QtCore/qdir.h>
12#include <QtCore/private/qstdweb_p.h>
13
14#include <emscripten/val.h>
15
17
18using namespace Qt::Literals;
19
20Q_LOGGING_CATEGORY(qWasmImageCapture, "qt.multimedia.wasm.imagecapture")
21/* TODO
22signals:
23imageExposed
24*/
26
27QWasmImageCapture::~QWasmImageCapture() = default;
28
29int QWasmImageCapture::capture(const QString &fileName)
30{
32 Q_EMIT error(m_lastId, QImageCapture::NotReadyError, msgCameraNotReady());
33 return -1;
34 }
35
36 QString imageFilenName;
37 if (fileName.isEmpty())
38 imageFilenName = QDir::homePath() + u"/image.jpg"_s;
39 else
40 imageFilenName = fileName;
41
42 QImage image = takePicture();
43 if (image.isNull())
44 return -1;
45
46 QImageWriter writer(imageFilenName);
47 // TODO
48 // writer.setQuality(quality);
49 // writer.setFormat("png");
50
51 if (writer.write(image)) {
52 qCDebug(qWasmImageCapture) << Q_FUNC_INFO << "image saved";
53 Q_EMIT imageSaved(m_lastId, fileName);
54 } else {
55 QImageCapture::Error err = (writer.error() == QImageWriter::UnsupportedFormatError)
56 ? QImageCapture::FormatError
57 : QImageCapture::ResourceError;
58
59 Q_EMIT error(m_lastId, err, writer.errorString());
60 }
61
62 return m_lastId;
63}
64
66{
68 Q_EMIT error(m_lastId, QImageCapture::NotReadyError, msgCameraNotReady());
69 return -1;
70 }
71
72 QImage image = takePicture();
73 if (image.isNull())
74 return -1;
75
76 Q_EMIT imageCaptured(m_lastId, image);
77 return m_lastId;
78}
79
80QImage QWasmImageCapture::takePicture()
81{
82 m_lastId++;
83
84 // Try the fast path: grab the current frame and convert via RHI.
85 QVideoFrame thisFrame = m_captureSession->videoSink()->videoFrame();
86 QImage image;
87 if (thisFrame.isValid()) {
88 Q_EMIT imageAvailable(m_lastId, thisFrame);
89 image = thisFrame.toImage();
90 }
91
92 if (image.isNull()) {
93 qCDebug(qWasmImageCapture) << Q_FUNC_INFO << "image capture failed";
94 Q_EMIT error(m_lastId, QImageCapture::ResourceError, QStringLiteral("Capture failed"));
95 return QImage();
96 }
97
98 Q_EMIT imageCaptured(m_lastId, image);
99 if (m_settings.resolution().isValid() && m_settings.resolution() != image.size())
100 image = image.scaled(m_settings.resolution());
101
102 return image;
103}
104
106{
107 return m_isReadyForCapture;
108}
109
111{
112 return m_settings;
113}
114
115void QWasmImageCapture::setImageSettings(const QImageEncoderSettings &settings)
116{
117 m_settings = settings;
118}
119
121{
122 if (m_isReadyForCapture != isReady) {
123 m_isReadyForCapture = isReady;
124 Q_EMIT readyForCaptureChanged(m_isReadyForCapture);
125 }
126}
127
128void QWasmImageCapture::setCaptureSession(QPlatformMediaCaptureSession *session)
129{
130 QWasmMediaCaptureSession *captureSession = static_cast<QWasmMediaCaptureSession *>(session);
131 // nullptr clears
132 if (m_captureSession == captureSession)
133 return;
134
135 if (captureSession) {
136 m_lastId = 0;
137 m_captureSession = captureSession;
138 }
139 m_captureSession = captureSession;
140}
141
142QT_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")