QML 相机尺寸问题
QML Camera size issue
当我将图像从 QML 传递到 Qt 以执行某些处理时,我遇到了图像大小问题。
我在 QML 文档中有一个 Camera
元素和一个 VideoOutput
元素,我有一个 class 可以获取相机图像以执行 C++ 中的更改。此 class 已注册用于 QML:main.cpp
中的 qmlRegisterType<processaImagem>("ProcessaImagemQml", 1, 0, "ProcessaImagem");
在 processaImagem class 中,我有一个名为 tamanhoImagem
的 Q_PROPERTY
,用于保存图像的大小。这个属性的值定义在QML文档里面camera.tamanhoImagem = Qt.size(cameraView.sourceRect.width, cameraView.sourceRect.height);
问题是 QML 中返回的图像大小与传递给 C++ 的相同值不同。在 QML 中 console.log("Tamanho da imagem: " + camera.tamanhoImagem);
的结果是 320 x 240
而在 C++ 中 qDebug() << p_tamanhoImagem;
的结果是 180 x 240
.
当我在智能手机上 运行 这段代码时,就会出现这个问题;在桌面上 运行 没有这个问题。
代码如下:
Camera {
id: camera
property string caminhoPreview: ""
property size tamanhoImagem: Qt.size(0, 0);
captureMode: Camera.CaptureStillImage
imageCapture {
onImageCaptured: {
imagemPreview.source = preview;
camera.caminhoPreview = preview;
camera.tamanhoImagem = Qt.size(cameraView.sourceRect.width, cameraView.sourceRect.height);
camera.stop();
console.log("Tamanho da imagem: " + camera.tamanhoImagem);
}
}
}
VideoOutput {
id: cameraView
visible: true
focus: visible
anchors.fill: parent
source: camera
orientation: camera.orientation
fillMode: VideoOutput.PreserveAspectFit
}
ProcessaImagem {
id: processaImagem
caminhoImagem: camera.caminhoPreview
tamanhoImagem: camera.tamanhoImagem
onCaminhoImagemChanged: {
ProvedorImagem.carregaImagem(processaImagem.carregaImagem());
}
}
processaimagem.h
class processaImagem : public QObject
{
Q_OBJECT
Q_PROPERTY(QString caminhoImagem READ caminhoImagem WRITE setCaminhoImagem NOTIFY caminhoImagemChanged)
Q_PROPERTY(QSize tamanhoImagem READ tamanhoImagem WRITE setTamanhoImagem NOTIFY tamanhoImagemChanged)
public slots:
QImage carregaImagem();
public:
processaImagem(QObject *parent = 0);
QString caminhoImagem() const;
void setCaminhoImagem(const QString valor);
QSize tamanhoImagem() const;
void setTamanhoImagem(const QSize valor);
private:
QString p_caminhoImagem = "";
QSize p_tamanhoImagem = QSize(0, 0);
signals:
void caminhoImagemChanged();
void tamanhoImagemChanged();
};
processaimagem.cpp
processaImagem::processaImagem(QObject *parent)
{
}
QImage processaImagem::carregaImagem()
{
QUrl caminhoImagem(p_caminhoImagem);
QQmlEngine *engine = QQmlEngine::contextForObject(this)->engine();
QQmlImageProviderBase *imageProviderBase = engine->imageProvider(caminhoImagem.host());
QQuickImageProvider *imageProvider = static_cast<QQuickImageProvider*>(imageProviderBase);
QString imageId = caminhoImagem.path().remove(0, 1);
QImage imagem = imageProvider->requestImage(imageId, &p_tamanhoImagem, p_tamanhoImagem);
if(imagem.isNull())
{
qDebug() << "Erro ao carregar a imagem";
imagem = QImage();
}
else
{
qDebug() << "p_imagem size: ";
qDebug() << p_tamanhoImagem;
}
}
QString processaImagem::caminhoImagem() const
{
return p_caminhoImagem;
}
void processaImagem::setCaminhoImagem(const QString valor)
{
if (valor != p_caminhoImagem)
{
p_caminhoImagem = valor;
emit caminhoImagemChanged();
}
}
QSize processaImagem::tamanhoImagem() const
{
return p_tamanhoImagem;
}
void processaImagem::setTamanhoImagem(const QSize valor)
{
bool alterou = false;
if (valor.width() != p_tamanhoImagem.width())
{
p_tamanhoImagem.setWidth(valor.width());
alterou = true;
}
if (valor.height() != p_tamanhoImagem.height())
{
p_tamanhoImagem.setHeight(valor.height());
alterou = true;
}
if(alterou)
{
emit tamanhoImagemChanged();
}
}
回答我自己的问题:
在方法 processaImagem
中,只需将一个空的 QSize 作为参数传递给提供者,它就会 return 原始尺寸的图像:
QImage processaImagem::carregaImagem()
{
QUrl caminhoImagem(p_caminhoImagem);
QQmlEngine *engine = QQmlEngine::contextForObject(this)->engine();
QQmlImageProviderBase *imageProviderBase = engine->imageProvider(caminhoImagem.host());
QQuickImageProvider *imageProvider = static_cast<QQuickImageProvider*>(imageProviderBase);
QSize imageSize;
QString imageId = caminhoImagem.path().remove(0, 1);
QImage imagem = imageProvider->requestImage(imageId, &imageSize, imageSize);
if(imagem.isNull())
{
qDebug() << "Erro ao carregar a imagem";
imagem = QImage();
}
else
{
qDebug() << "p_imagem size: ";
qDebug() << p_tamanhoImagem;
}
}
当我将图像从 QML 传递到 Qt 以执行某些处理时,我遇到了图像大小问题。
我在 QML 文档中有一个 Camera
元素和一个 VideoOutput
元素,我有一个 class 可以获取相机图像以执行 C++ 中的更改。此 class 已注册用于 QML:main.cpp
qmlRegisterType<processaImagem>("ProcessaImagemQml", 1, 0, "ProcessaImagem");
在 processaImagem class 中,我有一个名为 tamanhoImagem
的 Q_PROPERTY
,用于保存图像的大小。这个属性的值定义在QML文档里面camera.tamanhoImagem = Qt.size(cameraView.sourceRect.width, cameraView.sourceRect.height);
问题是 QML 中返回的图像大小与传递给 C++ 的相同值不同。在 QML 中 console.log("Tamanho da imagem: " + camera.tamanhoImagem);
的结果是 320 x 240
而在 C++ 中 qDebug() << p_tamanhoImagem;
的结果是 180 x 240
.
当我在智能手机上 运行 这段代码时,就会出现这个问题;在桌面上 运行 没有这个问题。
代码如下:
Camera {
id: camera
property string caminhoPreview: ""
property size tamanhoImagem: Qt.size(0, 0);
captureMode: Camera.CaptureStillImage
imageCapture {
onImageCaptured: {
imagemPreview.source = preview;
camera.caminhoPreview = preview;
camera.tamanhoImagem = Qt.size(cameraView.sourceRect.width, cameraView.sourceRect.height);
camera.stop();
console.log("Tamanho da imagem: " + camera.tamanhoImagem);
}
}
}
VideoOutput {
id: cameraView
visible: true
focus: visible
anchors.fill: parent
source: camera
orientation: camera.orientation
fillMode: VideoOutput.PreserveAspectFit
}
ProcessaImagem {
id: processaImagem
caminhoImagem: camera.caminhoPreview
tamanhoImagem: camera.tamanhoImagem
onCaminhoImagemChanged: {
ProvedorImagem.carregaImagem(processaImagem.carregaImagem());
}
}
processaimagem.h
class processaImagem : public QObject
{
Q_OBJECT
Q_PROPERTY(QString caminhoImagem READ caminhoImagem WRITE setCaminhoImagem NOTIFY caminhoImagemChanged)
Q_PROPERTY(QSize tamanhoImagem READ tamanhoImagem WRITE setTamanhoImagem NOTIFY tamanhoImagemChanged)
public slots:
QImage carregaImagem();
public:
processaImagem(QObject *parent = 0);
QString caminhoImagem() const;
void setCaminhoImagem(const QString valor);
QSize tamanhoImagem() const;
void setTamanhoImagem(const QSize valor);
private:
QString p_caminhoImagem = "";
QSize p_tamanhoImagem = QSize(0, 0);
signals:
void caminhoImagemChanged();
void tamanhoImagemChanged();
};
processaimagem.cpp
processaImagem::processaImagem(QObject *parent)
{
}
QImage processaImagem::carregaImagem()
{
QUrl caminhoImagem(p_caminhoImagem);
QQmlEngine *engine = QQmlEngine::contextForObject(this)->engine();
QQmlImageProviderBase *imageProviderBase = engine->imageProvider(caminhoImagem.host());
QQuickImageProvider *imageProvider = static_cast<QQuickImageProvider*>(imageProviderBase);
QString imageId = caminhoImagem.path().remove(0, 1);
QImage imagem = imageProvider->requestImage(imageId, &p_tamanhoImagem, p_tamanhoImagem);
if(imagem.isNull())
{
qDebug() << "Erro ao carregar a imagem";
imagem = QImage();
}
else
{
qDebug() << "p_imagem size: ";
qDebug() << p_tamanhoImagem;
}
}
QString processaImagem::caminhoImagem() const
{
return p_caminhoImagem;
}
void processaImagem::setCaminhoImagem(const QString valor)
{
if (valor != p_caminhoImagem)
{
p_caminhoImagem = valor;
emit caminhoImagemChanged();
}
}
QSize processaImagem::tamanhoImagem() const
{
return p_tamanhoImagem;
}
void processaImagem::setTamanhoImagem(const QSize valor)
{
bool alterou = false;
if (valor.width() != p_tamanhoImagem.width())
{
p_tamanhoImagem.setWidth(valor.width());
alterou = true;
}
if (valor.height() != p_tamanhoImagem.height())
{
p_tamanhoImagem.setHeight(valor.height());
alterou = true;
}
if(alterou)
{
emit tamanhoImagemChanged();
}
}
回答我自己的问题:
在方法 processaImagem
中,只需将一个空的 QSize 作为参数传递给提供者,它就会 return 原始尺寸的图像:
QImage processaImagem::carregaImagem()
{
QUrl caminhoImagem(p_caminhoImagem);
QQmlEngine *engine = QQmlEngine::contextForObject(this)->engine();
QQmlImageProviderBase *imageProviderBase = engine->imageProvider(caminhoImagem.host());
QQuickImageProvider *imageProvider = static_cast<QQuickImageProvider*>(imageProviderBase);
QSize imageSize;
QString imageId = caminhoImagem.path().remove(0, 1);
QImage imagem = imageProvider->requestImage(imageId, &imageSize, imageSize);
if(imagem.isNull())
{
qDebug() << "Erro ao carregar a imagem";
imagem = QImage();
}
else
{
qDebug() << "p_imagem size: ";
qDebug() << p_tamanhoImagem;
}
}