Qt提供了四个用于处理图像数据的类:QImage、QPixmap、QBitmap和QPicture。QImage专门为I/O和直接像素访问和操作进行了设计和优化,而QPixmap则专门为在屏幕上显示图像进行了设计和优化。QBitmap只是一个方便的类别,继承自QPixmap,保证深度为1。最后,QPicture类是一个绘画设备,可以记录并回放QPainter命令。

介绍

QImage是Qt中用于处理图像的基本类之一。它提供了加载、保存、创建和操作图像的功能,可以读取多种格式的图像文件,并对其进行转换、缩放、旋转、镜像等各种操作。

QImage内部存储图像数据的方式为逐行扫描,颜色分量可以使用RGB、ARGB、索引等多种格式表示。QImage类提供了一组成员函数,包括得到图像大小、位深度、颜色空间、像素值、像素和字节的访问等操作。这些函数不仅能够帮助用户快速创建和处理图像,而且还支持与其他Qt图形组件无缝集成。

除此之外,QImage还提供了一些高级的图像处理功能,例如色彩调整、二值化、模糊等操作,以及通过QPainter绘制图像和文本,截取部分区域,转换成QPixmap等方便实用的接口。

在Qt应用程序中,QImage常常用于处理静态图片资源,比如标识、界面元素等。同时,由于QImage内部存储机制灵活且支持多线程访问,因此也适用于一些需要高效显示图像的场景,例如视频流播放和CCTV监控等。

总之,QImage是一个十分实用且灵活的图像处理类,它具有丰富的功能和接口,能够帮助Qt应用程序轻松操作各种图像。

接口介绍

QImage是Qt用于处理图像数据的一个核心类,其提供了丰富的接口函数以便开发者进行对图像进行读取、修改及操作等。下面将介绍其中一部分接口函数以及它们的作用。

  1. QImage() - 构造函数。创建一个空白的QImage对象。可以使用load()或者createFromData()等其他成员函数来加载数据到QImage中。

  2. QImage(const QSize &size, Format format) - 构造函数。创建一个大小为size并且格式为format的QImage对象。如果希望后续的图像操作能够更快地执行,则建议在这里指定格式。

  3. QImage(const uchar *data, int width, int height, Format format) - 构造函数。创建一个包含图像数据和大小信息的QImage对象。参数data指向包含图像数据的缓冲区,width和height指定图像的宽度和高度,format指定数据的格式。

  4. bool load(const QString &fileName, const char *format = nullptr) - 从文件中加载图像数据。fileName参数指定要读取的文件名,format参数指定文件的类型(如bmp、jpg、png等),如果该参数为nullptr则会根据文件后缀名自动识别。

  5. bool save(const QString &fileName, const char *format = nullptr, int quality = -1) - 将图像数据保存到磁盘上。fileName参数指定要保存到的文件名,format参数指定文件的类型。quality参数用于指定图像的质量,取值范围为0~100。如果可以的话,推荐使用高质量的格式如png。

  6. int width() const - 获取图像的宽度值。

  7. int height() const - 获取图像的高度值。

  8. QSize size() const - 获取图像的大小(即宽度和高度)。

  9. QRgb pixel(int x, int y) const - 获取给定坐标(x,y)处的像素值。返回值为QRgb类型,其中前8位表示该像素的Alpha通道值,后24位分别表示红、绿、蓝三个颜色通道的值。

  10. void setPixel(int x, int y, uint index_or_rgb) - 设置给定坐标(x,y)处的像素值。参数index_or_rgb可以是一个整数,表示深度为1或8的图像中的灰度索引值;或者是QRgb类型的像素值,其中对应的26位二进制码随即会被写入到QImage对象的相应像素之中。

  11. bool isNull() const - 判断该QImage对象是否为空。空的对象不包含任何数据。

  12. bool isGrayscale() const - 判断该QImage对象是否为灰度图像。只有格式为QImage::Format_Grayscale[8|16]或QImage::Format_Indexed8并且调色板中的条目个数小于等于2时才会返回true。其他情况下将返回false。

  13. QImage copy(const QRect &rectangle = QRect()) const - 复制图像数据。如果指定rectangle,则仅复制该区域的图像数据,否则将复制整个图像。

  14. void fill(const QColor &color) - 用给定颜色填充整个图像。

此外,QImage还提供了许多其他的接口函数,如:scaled()、mirrored()、transformed()、copy()等。这些函数可以帮助开发者完成图像缩放、翻转以及旋转等操作,并且在许多实际场景中都非常有用。

代码演示

mainwindow.h

#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>
class QPainter;
class QImage;
class QPen;
class QRect;
class QFont;
class QPoint;
class QSize;
class QDebug;

QT_BEGIN_NAMESPACE
namespace Ui { class MainWindow; }
QT_END_NAMESPACE

class MainWindow : public QMainWindow
{
    Q_OBJECT

public:
    MainWindow(QWidget *parent = nullptr);
    ~MainWindow();

private:
    Ui::MainWindow *ui;
};
#endif // MAINWINDOW_H

mainwindow.cpp

#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QPainter>
#include <QDebug>

MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
    , ui(new Ui::MainWindow)
{
    ui->setupUi(this);

    // 创建一个300x200大小、RGB格式的图像,并用黑色绘制矩形和文本
    QImage image(300, 200, QImage::Format_RGB888);
    image.fill(Qt::white);
    QPainter painter(&image);
    painter.setPen(QPen(Qt::black, 5));
    painter.drawRect(QRect(30, 30, 240, 140));
    painter.setFont(QFont("Arial", 16, QFont::Bold));
    painter.drawText(QPoint(65, 85), "Hello QImage!");

    // 获取图像信息
    int width = image.width();
    int height = image.height();
    int depth = image.depth();
    QSize size = image.size();
    QImage::Format format = image.format();

    qDebug() << "Image info:";
    qDebug() << "Width: " << width;
    qDebug() << "Height: " << height;
    qDebug() << "Depth: " << depth;
    qDebug() << "Size: " << size.width() << "x" << size.height();
    qDebug() << "Format: " << format;

    // 计算图像的像素数量
    int pixelCount = width * height;
    qDebug() << "Pixel count: " << pixelCount;

    // 访问像素
    QRgb pixel1 = image.pixel(50, 50); // 获取指定位置像素值
    QRgb pixel2 = qRgb(255, 0, 0); // 通过 RGB 值创建像素
    image.setPixel(70, 80, pixel2); // 设置指定位置像素值

    // 获取图像的红、绿、蓝、透明度信息
    int red = qRed(pixel1);
    int green = qGreen(pixel1);
    int blue = qBlue(pixel1);
    qDebug() << "Pixel value at (50, 50): R=" << red << ", G=" << green << ", B=" << blue;

    // 缩放图片
    QImage scaledImage = image.scaled(150, 100, Qt::KeepAspectRatio, Qt::SmoothTransformation);
    qDebug() << "Scaled image info:";
    qDebug() << "Width: " << scaledImage.width();
    qDebug() << "Height: " << scaledImage.height();

    //保存图片
    QString filename = "test.png";
    if (image.save(filename))
        qDebug() << "Image saved as" << filename;
    else
        qDebug() << "Failed to save image.";

    //保存缩放后的图片
    QString filename2 = "testScaled.png";
    if (scaledImage.save(filename2))
        qDebug() << "Image saved as" << filename2;
    else
        qDebug() << "Failed to save image.";

}

MainWindow::~MainWindow()
{
    delete ui;
}

注意事项

在使用QImage时,需要注意以下几个问题:

  1. 内存管理:一旦创建了一个QImage对象,它就会占用系统内存。因此,在处理大量图像时特别要注意内存的使用。可以使用QPixmap缩放和显示图像以节省内存。

  2. 像素格式:当创建QImage对象时,要指定正确的像素格式。这很重要,因为图像处理通常需要对像素值进行操作。如果格式不正确,可能导致意想不到的结果或崩溃。

  3. 图像路径:加载和保存图像时要确保指定了正确的路径。否则,可能会失败或访问错误的文件。

  4. 线程安全:在多线程环境下,应该注意QImage对象的线程安全性。最好避免在多个线程中同时操作同一个QImage对象。

  5. 图像质量:在缩放图像或进行其他处理时,要注意图像质量问题。缩放通常会降低图像质量,应该选择合适的算法和参数来避免图像失真。

  6. 跨平台问题:虽然Qt是跨平台框架,但不同平台可能支持的像素格式、图像大小、文件格式等方面存在差异。因此,要在不同平台上测试和验证所编写的图像处理代码。

06-09 13:55