您的位置:

QImage读取图片的详细解析

一、QImage是什么?

QImage是QT中最基本的图像处理类,它可以用来加载、显示、保存、特效处理数字图像,支持BMP,JPEG,PNG等多种图片格式。相对于QPixmap,它更为全面、强大。

二、QImage读取图片的基本操作

1. 读取一张图片

#include <QApplication>
#include <QLabel>
#include <QImage>

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);

    QImage img(":/images/image.jpg"); // 读取本地图片

    QLabel label;
    label.setPixmap(QPixmap::fromImage(img));
    label.show();

    return a.exec();
}

2. 在图片上绘制文字和图形

#include <QApplication>
#include <QLabel>
#include <QImage>
#include <QPainter>

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);

    QImage img(":/images/image.jpg"); 

    QPainter painter(&img); // 创建QPainter对象

    painter.setPen(QColor(255, 0, 0)); // 设置画笔颜色
    painter.drawText(QRect(0, 0, img.width(), 50), "Hello World!"); // 在图片上绘制文本

    painter.setBrush(QBrush(QColor(0, 255, 0))); // 设置画刷颜色
    painter.drawRect(QRect(50, 50, 100, 100)); // 在图片上绘制矩形

    QLabel label;
    label.setPixmap(QPixmap::fromImage(img));
    label.show();

    return a.exec();
}

3. 裁剪、缩放和旋转图片

#include <QApplication>
#include <QLabel>
#include <QImage>
#include <QTransform>

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);

    QImage img(":/images/image.jpg"); 

    // 裁剪图片
    img = img.copy(QRect(50, 50, 100, 100));

    // 缩放图片
    img = img.scaled(QSize(200, 200), Qt::KeepAspectRatio, Qt::SmoothTransformation);

    // 旋转图片
    QTransform transform;
    transform.rotate(45);
    img = img.transformed(transform, Qt::SmoothTransformation);

    QLabel label;
    label.setPixmap(QPixmap::fromImage(img));
    label.show();

    return a.exec();
}

三、使用QImage加载网络图片

1. 使用QNetworkAccessManager从网络上下载图片

#include <QApplication>
#include <QLabel>
#include <QNetworkAccessManager>
#include <QNetworkRequest>
#include <QNetworkReply>
#include <QByteArray>
#include <QBuffer>

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);

    // 初始化网络请求
    QNetworkAccessManager manager;
    QNetworkRequest request(QUrl("https://www.example.com/image.jpg"));
    QNetworkReply *reply = manager.get(request);

    // 等待图片加载完成
    while (!reply->isFinished()) {
        qApp->processEvents();
    }

    // 读取图片数据
    QByteArray data = reply->readAll();

    // 将字节数组转换为QImage对象
    QImage img;
    img.loadFromData(data);

    // 显示图片
    QLabel label;
    label.setPixmap(QPixmap::fromImage(img));
    label.show();

    return a.exec();
}

2. 直接使用QImage加载网络图片

#include <QApplication>
#include <QLabel>
#include <QUrl>
#include <QImageReader>

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);

    // 初始化QImageReader
    QImageReader reader(QUrl("https://www.example.com/image.jpg"));
    reader.setAutoTransform(true);

    // 读取图片
    QImage img = reader.read();

    // 显示图片
    QLabel label;
    label.setPixmap(QPixmap::fromImage(img));
    label.show();

    return a.exec();
}

四、QImage的高级用法

1. 使用QImage进行图像处理

#include <QApplication>
#include <QLabel>
#include <QImage>

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);

    QImage img(":/images/image.jpg"); 

    // 转为灰度图像
    img = img.convertToFormat(QImage::Format_Grayscale8);

    // 像素级操作
    for (int x = 0; x < img.width(); x++) {
        for (int y = 0; y < img.height(); y++) {
            int gray = qGray(img.pixel(x, y)); // 获取当前像素点的灰度值
            img.setPixel(x, y, qRgb(gray, gray, gray)); // 设置当前像素点的RGB值为灰度值
        }
    }

    // 显示图片
    QLabel label;
    label.setPixmap(QPixmap::fromImage(img));
    label.show();

    return a.exec();
}

2. 使用QImage进行图像特效处理

#include <QApplication>
#include <QLabel>
#include <QImage>
#include <QRgb>

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);

    QImage img(":/images/image.jpg"); 

    // 边缘检测
    QImage edge = img.copy();
    edge = edge.convertToFormat(QImage::Format_Grayscale8);
    for (int x = 1; x < img.width() - 1; x++) {
        for (int y = 1; y < img.height() - 1; y++) {
            int gx = qGray(edge.pixel(x + 1, y)) - qGray(edge.pixel(x - 1, y));
            int gy = qGray(edge.pixel(x, y + 1)) - qGray(edge.pixel(x, y - 1));
            int gray = qSqrt(gx * gx + gy * gy);
            edge.setPixel(x, y, qRgb(gray, gray, gray));
        }
    }

    // 反色
    QImage invert = img;
    for (int x = 0; x < img.width(); x++) {
        for (int y = 0; y < img.height(); y++) {
            QRgb color = img.pixel(x, y);
            int r = 255 - qRed(color);
            int g = 255 - qGreen(color);
            int b = 255 - qBlue(color);
            invert.setPixel(x, y, qRgb(r, g, b));
        }
    }

    // 显示特效处理后的图片
    QWidget widget;
    QLabel *label1 = new QLabel(&widget);
    QLabel *label2 = new QLabel(&widget);
    label1->setPixmap(QPixmap::fromImage(edge));
    label2->setPixmap(QPixmap::fromImage(invert));
    QHBoxLayout *layout = new QHBoxLayout(&widget);
    layout->addWidget(label1);
    layout->addWidget(label2);
    widget.setLayout(layout);
    widget.show();

    return a.exec();
}