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

原创文章,作者:小蓝,如若转载,请注明出处:https://www.506064.com/n/280873.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
小蓝小蓝
上一篇 2024-12-21 13:05
下一篇 2024-12-21 13:05

相关推荐

  • 用Python绘制酷炫图片

    在本篇文章中,我们将展示如何使用Python绘制酷炫的图片。 一、安装Python绘图库 在使用Python绘制图片之前,我们需要先安装Python绘图库。Python有很多绘图库…

    编程 2025-04-29
  • 使用axios获取返回图片

    使用axios获取返回图片是Web开发中很常见的需求。本文将介绍如何使用axios获取返回图片,并从多个方面进行详细阐述。 一、安装axios 使用axios获取返回图片前,首先需…

    编程 2025-04-29
  • Python 图片转表格

    本文将详细介绍如何使用Python将图片转为表格。大家平时在处理一些资料的时候难免会遇到图片转表格的需求。比如从PDF文档中提取表格等场景。当然,这个功能也可以通过手动复制、粘贴,…

    编程 2025-04-29
  • Python缓存图片的处理方式

    本文将从多个方面详细阐述Python缓存图片的处理方式,包括缓存原理、缓存框架、缓存策略、缓存更新和缓存清除等方面。 一、缓存原理 缓存是一种提高应用程序性能的技术,在网络应用中流…

    编程 2025-04-29
  • Python如何抓取图片数据

    Python是一门强大的编程语言,能够轻松地进行各种数据抓取与处理。抓取图片数据是一个非常常见的需求。在这篇文章中,我们将从多个方面介绍Python如何抓取图片数据。 一、使用ur…

    编程 2025-04-29
  • Avue中如何按照后端返回的链接显示图片

    Avue是一款基于Vue.js、Element-ui等技术栈的可视化开发框架,能够轻松搭建前端页面。在开发中,我们使用到的图片通常都是存储在后端服务器上的,那么如何使用Avue来展…

    编程 2025-04-28
  • Python利用Image加图片的方法

    在Python中,利用Image库可以快速处理图片,并加入需要的图片,本文将从多个方面详细阐述这个操作。 一、Image库的安装和基础操作 首先,我们需要在Python中安装Ima…

    编程 2025-04-28
  • 使用CKSlide实现图片轮播

    CKSlide是一个基于jQuery的插件,可以方便地为网页添加幻灯片和图片轮播效果。使用CKSlide可以让网站更加生动、活泼,给用户带来更好的体验。 一、CKSlide基本用法…

    编程 2025-04-28
  • Python中使用socket传输图片

    本文将从多个方面介绍如何使用Python中的socket模块传输图片,涉及到准备工作、发送方部分和接收方部分的详细代码实现。 一、准备工作 在使用Python中的socket模块进…

    编程 2025-04-28
  • Python窗口中导入图片

    Python作为一种高级语言,在图形界面的应用和操作方面越来越得心应手。本篇文章将详细阐述Python窗口中导入图片的方法和实现。 一、导入图片的准备工作 在导入图片前,我们需要先…

    编程 2025-04-28

发表回复

登录后才能评论