44、QImage---------绘图

张开发
2026/4/14 4:26:12 15 分钟阅读

分享文章

44、QImage---------绘图
QImageQImage 是 Qt 框架中的一个类用于处理和操作图像数据。它提供了多种功能包括加载、保存、转换和绘制图像。以下是 QImage 的详细知识点和功能1. 基本概念●定义: QImage 是一个用于处理图像的类支持多种格式如 BMP、PNG、JPEG 等并提供了对图像数据的低级访问。●用途: 常用于图形应用程序中能够加载和保存图像文件进行图像处理和绘制。2. 创建 QImage默认构造函数: 创建一个空的QImage对象。QImage image;指定大小和格式: 创建一个指定大小和格式的QImage。QImage image(width, height, QImage::Format_RGB32);从文件加载: 从文件加载图像。QImage image(path/to/image.png);从其他 QImage 复制: 通过复制构造函数创建一个新的 QImage。QImage copyImage(originalImage);3. 图像格式格式类型QImage::Format_RGB32每个像素占用 32 位RGBA适用于高质量图像。QImage::Format_ARGB32包含 Alpha 通道透明度。QImage::Format_Grayscale8灰度图像。QImage::Format_Mono单色图像。4. 图像操作图像大小:获取图像的宽度和高度int width image.width(); int height image.height();缩放和裁剪:缩放图像QImage scaledImage image.scaled(newWidth, newHeight);裁剪图像QImage croppedImage image.copy(x, y, width, height);旋转和翻转:旋转图像QImage rotatedImage image.transformed(QMatrix().rotate(90));水平翻转image image.mirrored(true, false);5. 图像保存保存到文件: 将图像保存到文件中支持多种格式。image.save(path/to/save/image.png, PNG);7. 绘制 QImage在 QWidget 上绘制:void MyWidget::paintEvent(QPaintEvent *event) { QPainter painter(this); painter.drawImage(0, 0, image); }使用QPainter在QWidget上绘制QImage。8. 示例: 加载修改保存图像我们希望创建一个ImageWidget加载原有的图片资源并在原有的图片资源基础上绘制一个圆形的红色圈圈并且通过widget显示出来实现过程我们创建一个QT项目名称为ImageWidget窗口名称为ImageWidget继承自QWidget.项目建立好后右键项目添加新建文件选择Qt resource file名称叫做res即可无需创建前缀前缀为/即可添加文件选择文件夹中的th.jpg在ImageWidget中添加QImage成员和声明paintEvent函数protected: void paintEvent(QPaintEvent* event) override; private: QImage image;接下来在ImageWidget构造函数中加载图片资源ImageWidget::ImageWidget(QWidget *parent) : QWidget(parent), ui(new Ui::ImageWidget) { ui-setupUi(this); //加载图像 if(!image.load(:/th.jpg)){ // 确保资源路径正确如果加载失败则创建一个像素32位的图像 image QImage(200,200,QImage::Format_ARGB32); //填充颜色 image.fill(Qt::white); } //对图像处理... }我们可以使用QPainter在图片中心上绘制一个红色的圆圈ImageWidget::ImageWidget(QWidget *parent) : QWidget(parent), ui(new Ui::ImageWidget) { ui-setupUi(this); //加载图像 if(!image.load(:/th.jpg)){ // 确保资源路径正确如果加载失败则创建一个像素32位的图像 image QImage(200,200,QImage::Format_ARGB32); //填充颜色 image.fill(Qt::white); } // 对图像进行简单处理在图像中心绘制一个红色圆圈 QPainter painter(image); //设置抗锯齿 painter.setRenderHint(QPainter::Antialiasing, true); //设置画刷 painter.setBrush(Qt::red); //画圆形在图片中心且半径为50 painter.drawEllipse(image.rect().center(), 50, 50); // 保存修改后的图像可选 image.save(modified_image.png); // 设置固定的大小 setFixedSize(image.size()); }此时运行程序后去运行的目录里会看到有一个新的图片modified_image.png打开看图片上有一个红色的圆圈我们接下来在ImageWidget上绘制这个图片可以重写paintEvent函数采用QPainter绘制void ImageWidget::paintEvent(QPaintEvent *event) { Q_UNUSED(event); QPainter painter(this); //绘制图像函数 painter.drawImage(0, 0, image); }程序启动后可以看到widget中绘制了我们添加的图片9. 示例: 图像转灰度图像我们实现在一个widget中展示一个图片的不同效果一个原图一个灰度图如下图所示实现过程我们新建项目主窗口创建GrayscaleWidget继承自QWidget接下来我们在类的声明中声明两个QImage类型的变量, 并且重写paintEvent函数class GrayscaleWidget : public QWidget { Q_OBJECT public: explicit GrayscaleWidget(QWidget *parent nullptr); ~GrayscaleWidget(); protected: //重写绘制逻辑 virtual void paintEvent(QPaintEvent *event) override; private: Ui::GrayscaleWidget *ui; //存储彩色图像 QImage colorImage; //存储灰度图 QImage grayImage; };接下来我们在构造函数中加载我们的彩色图片资源加载图片资源前也是需要将图片资源添加到项目里通过创建qt 资源再添加GrayscaleWidget::GrayscaleWidget(QWidget *parent) : QWidget(parent), ui(new Ui::GrayscaleWidget) { ui-setupUi(this); // 加载彩色图像 if (!colorImage.load(:/th.jpg)) { // 确保资源路径正确 colorImage QImage(200, 200, QImage::Format_ARGB32); colorImage.fill(Qt::white); } // 转换为灰度图像 grayImage colorImage.convertToFormat(QImage::Format_Grayscale8); //设置窗口大小 setFixedSize(colorImage.width() * 2 10, colorImage.height()); }重写绘制事件void GrayscaleWidget::paintEvent(QPaintEvent *event) { Q_UNUSED(event); //创建painter QPainter painter(this); // 绘制彩色图像 painter.drawImage(0, 0, colorImage); // 在彩色图像右侧绘制灰度图像 painter.drawImage(colorImage.width() 10, 0, grayImage); }

更多文章