首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >将图像从QUrl加载到QImage (QImage)

将图像从QUrl加载到QImage (QImage)
EN

Stack Overflow用户
提问于 2022-11-04 16:16:53
回答 1查看 56关注 0票数 0

我正在尝试使用QML源从QML加载一个图像。在main.qml中,我有:

代码语言:javascript
复制
Image {
    id: photoFiltering
    fillMode: Image.PreserveAspectFit
    width: parent.width
    height: parent.height/2
    anchors.leftMargin: 20
    anchors.rightMargin: 20
    anchors.bottomMargin: 20
}

代码语言:javascript
复制
Button{
            id: filtersButtons
            text: "Filter"
            anchors.top: photoFiltering.bottom
            anchors.horizontalCenter: photoFiltering.horizontalCenter
            onClicked: ()=>{
                filterController.setFilterType(filterController.Original);
                var filteredImage = filterController.filterImage(photoFiltering.source);
            }
        }

因此,在我的C++代码中,我将尝试执行以下操作:

代码语言:javascript
复制
QImage FilterController::filterImage(QString imageSource)
{
    QImage image;
    bool loaded = image.load(imageSource);
    cout << "image laoded " << loaded << endl;
     ...
    return image;
}

问题是,我不能简单地加载这样的图像来获得对象QImage。我该怎么做才能得到那张照片?

EN

回答 1

Stack Overflow用户

发布于 2022-11-05 01:41:04

这是从QImage中检索QUrl的一种方法:

使用QNetworkReply::readAll()将QNetworkAccessManager

  • Turns您的QUrl实例化为QNetworkRequest

  • Invokes QNetworkAccessManager::get()

  • Asynchronously等待QNetworkAccessManager::finished()信号

  • 以获取QByteArray

  • Use QImage::loadFromData以填充QImage

下面是一个用于执行上述操作的ImageUtil助手类:

代码语言:javascript
复制
//ImageUtil.h
#ifndef __ImageUtil__
#define __ImageUtil__

#include <QObject>
#include <QImage>
#include <QNetworkAccessManager>
#include <QNetworkReply>

class ImageUtil : public QObject
{
    Q_OBJECT
public:
    ImageUtil(QObject* parent = nullptr) :
        QObject(parent),
        m_Manager(new QNetworkAccessManager(this))
    {
        connect(m_Manager, &QNetworkAccessManager::finished, this, &ImageUtil::onFinished);
    }

    const QImage& image() const { return m_Image; }
    Q_INVOKABLE void loadFromUrl(const QUrl& url)
    {
        QNetworkRequest request(url);
        m_Manager->get(request);
    }

signals:
    void loaded();

protected slots:
    void onFinished(QNetworkReply* reply)
    {
        QByteArray data = reply->readAll();
        m_Image.loadFromData(data);
        emit loaded();
    }

protected:
    QImage m_Image;
    QNetworkAccessManager* m_Manager;

};

#endif

这是对全班的一次测试:

代码语言:javascript
复制
void test()
{
    ImageUtil* imageUtil = new ImageUtil();
    imageUtil->loadFromUrl(QUrl("https://www.google.com/images/branding/googlelogo/1x/googlelogo_color_272x92dp.png"));
    imageUtil->connect(imageUtil, &ImageUtil::loaded,
                       [=]() {
        QImage image = imageUtil->image();
        qDebug() << image.width() << image.height(); // 272 92
    });
}

请将上述代码作为指南,不要期望它在生产环境中站稳脚跟。要想做好一份正确的工作,你真的需要明白:

用于实例化和清理类的

  • Qt信号/时隙
  • 模式(特别是测试代码泄漏,因此需要进行适当的测试)
  • 没有HTTP错误处理(无效的HTTP/HTTPS请求、糟糕或没有互联网连接、404错误(即没有图像)、HTTPS/SSL证书错误、其他HTTP状态错误
  • 没有图像处理(下载的内容可能不是有效的图像)
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/74320020

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档