QImage类的使用

news/2024/10/30 19:32:18/

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_NAMESPACEclass MainWindow : public QMainWindow
{Q_OBJECTpublic: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;elseqDebug() << "Failed to save image.";//保存缩放后的图片QString filename2 = "testScaled.png";if (scaledImage.save(filename2))qDebug() << "Image saved as" << filename2;elseqDebug() << "Failed to save image.";}MainWindow::~MainWindow()
{delete ui;
}

注意事项

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

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

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

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

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

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

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


http://www.ppmy.cn/news/292818.html

相关文章

Endnote X9收藏网址--安装、使用

1.下载&#xff08;中科大&#xff09; 链接&#xff1a;https://pan.baidu.com/s/14HepWUqE_PXPq9bb06tlSw 提取码&#xff1a;v289 2.操作指南 参考&#xff1a; 使用 EndNote 9 引用参考文献-英文 原文链接&#xff1a;https://blog.csdn.net/The_best_man/article/details…

【Endnote X9安装过程】

1.下载解压安装包之后打开ENX9Inst.msi文件&#xff1a; 2.点击Next&#xff0c;这里因为是有License.dat文件&#xff0c;所以不用输入序列号&#xff0c;点击Accept就行&#xff1a; 注意解压的时候.dat文件和.msi文件要放在同一个文件夹中 3.点击同意&#xff0c;下一步&…

vivox9android7.1版本,VivoX9升级安卓7.1,功能太强悍

原标题&#xff1a;VivoX9升级安卓7.1&#xff0c;功能太强悍 随着国产的手机行业品牌对于自身旗下的手机性能方面的要求越来越高&#xff0c;各大手机品牌也开始对手机性能做了升级。前不久&#xff0c;vivo就发布了新机vivo x9&#xff0c;而在近段时间&#xff0c;vivo x9系…

从鸿蒙发布看互联网周边生态,拍照性能双升级 倪妮代言vivo X9s上手体验

性能配置 配置方面&#xff0c;较上一代产品&#xff0c;vivo X9s升级了处理器跟电池&#xff0c;讲道理&#xff0c;上代产品我做过测试&#xff0c;基础体验的流畅度很不错(vivo的4G普及做的很好)&#xff0c;而此次升级到了成熟的中端处理器骁龙652后&#xff0c;可谓是让X9…

Error!!在k8s中查看pod日志报错

目录 1、报错现象2、解决思路3、解决方法 1、报错现象 2、解决思路 查看pod日志发现报错原因是权限问题 3、解决方法 [rootmaster01 ~]# kubectl create clusterrolebinding cluster-system-anonymous --clusterrolecluster-admin --usersystem:anonymous #指定集群中的匿…

endnote x9说明书

给大家整个endnote x9说明书 找了一圈endnote x9的说明书&#xff0c;国内基本都不能下载&#xff0c;生气&#xff01;今天我就给大家整个免费的说明书&#xff01; 链接&#xff1a;https://pan.baidu.com/s/1J3wQ9zViiw_f1yFVJfcgGw 提取码&#xff1a;3crj 大家自己在里面找…

文献管理软件Endnote X9入门使用

文献管理软件Endnote X9入门教程 ​ Endnote是一款被广泛使用的文献管理软件&#xff0c;它可以在本地建立个人文献数据库&#xff0c;实现文献及引文信息的保存、分组整理、标记、检索等功能。在撰写Word版的毕业论文或LaTeX版的期刊会议论文时&#xff0c;可以使用Endnote官…

k8s常用工作负载

k8s常用工作负载 工作负载控制器(Workload Controllers)时k8s的一个抽象的概念&#xff0c;用于更高级层次对象&#xff0c;部署和管理Pod&#xff0c;常用于工作负载控制器&#xff1a; Deployment&#xff1a;无状态应用部署 StatefulSet&#xff1a;有状态应用部署 Daem…