簡體   English   中英

QML相機尺寸問題

[英]QML Camera size issue

當我將圖像從QML傳遞到Qt進行一些處理時,圖像尺寸出現問題。

我在QML文檔中有一個Camera元素和一個VideoOutput元素,並且我有一個使用Camera圖像執行C ++更改的類。 此類注冊為與QML一起使用: qmlRegisterType<processaImagem>("ProcessaImagemQml", 1, 0, "ProcessaImagem"); 在main.cpp中

在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();
    }
}

回答我自己的問題:

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;
    }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM