QML 相机尺寸问题

Posted

技术标签:

【中文标题】QML 相机尺寸问题【英文标题】:QML Camera size issue 【发布时间】:2015-11-11 18:47:44 【问题描述】:

当我将图像从 QML 传递到 Qt 以执行某些处理时,我遇到了图像大小问题。

我在 QML 文档中有一个 Camera 元素和一个 VideoOutput 元素,并且我有一个使用相机图像执行 C++ 更改的类。此类已注册以与 QML 一起使用:main.cpp 中的qmlRegisterType<processaImagem>("ProcessaImagemQml", 1, 0, "ProcessaImagem");

在 processaImagem 类中,我有一个名为 tamanhoImagemQ_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();
    

【问题讨论】:

【参考方案1】:

回答我自己的问题:

processaImagem 方法中,只需将一个空的 QSize 作为参数传递给提供者,它就会返回原始大小的图像:

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 相机尺寸问题的主要内容,如果未能解决你的问题,请参考以下文章

在 Android 中运行的 QML 相机死了

QML 在 ListView 中显示的相机照片被破坏

如何检索 QML 相机提要并发送到 C++ 后端

连接滑块以控制 qml 相机的缩放

如何使用 Qt/C++ 小部件(不是 QML)从 Android 相机获取图像

当 QML 项目的尺寸发生变化时如何得到通知?