[Qt Topic] – 二维绘图研习,做一个简单批量水印工具

简介:

[Qt Topic] – 二维绘图研习,做一个简单批量水印工具

作者:Jason Lee

日期:2010-05-02

平台:Qt SDK v2010.02.1 + Windows Xp

声明:文章作者仅在Intel软件网络CSDN博客发表本文,如有转载,请注明出处

 

[1]二维绘图概览

Qt中的二维绘图是基于QPainterQPaintEngineQPaintDevice机制的:以QPaintEngine作为中间接口,使用QPainter在不同绘图设备上进行绘图操作,而QPaintDevice就是可使用QPainter进行绘图的二维空间。

使用QPainter可以在绘图设备上进行绘制以下类的实例:QImageQBitmapQIconQPixmapQPicture等各种图像和QPointQLineQPolygon等各种图形以及其它许多,难以列举。

目前QPaintDevice的子类有QWidgetQGLWidgetQImageQPixmapQGLPixelBufferQGLFrameBufferObjectQPictureQPrinter。也就是说,可以使用QPainter对这些类的实例进行绘图操作。

 

[2]批量水印工具简单设想

第一,既然是批量处理,那么第一个要求是能够打开多个文件。在这里,我将之处理为打开一个文件夹下面所有可支持的图片,但并未继续递归深入地读取子文件夹。

第二,要有水印功能,就要求工具能够对打开的图片进行绘图操作。这一点比较简单,就是以上提到的使用QPainter在绘图设备上(比如QImage)进行绘图操作。针对这项功能,我只是简单地提供一个行文本框以输入要水印的文字。

第三,因为只是一个简单的、练手的小工具,所以我真的十分简单地实现了它的界面、功能。

第四,可以稍微讨论的扩展有:不只是可以用文本进行水印,也可以用图片,原理基本一致;可以继续递归地打开子文件夹中的图像;可以对QListWidget中的项进行右键处理,比如从列表中移除;其它……

 

[3]简单水印工具的实现

首先是布局代码。我简单地将界面分为3列:第一列用来打开目标文件夹,进而对里面的图片进行处理;第二列是图片列表,可以切换着观察图片;第三列就是图片浏览区域。以下是部分代码:

QLabel *markLabel; QLineEdit *markText; QHBoxLayout *markLayout; QLabel *folderLabel; QLineEdit *folderEdit; QPushButton *openFolderBtn; QHBoxLayout *folderLayout; QPushButton *applyBtn; QVBoxLayout *leftLayout; QListWidget *filesList; QLabel *imageLabel; QScrollArea *scrollArea; QHBoxLayout *mainLayout;   

接着是打开目标文件夹,

connect(openFolderBtn, SIGNAL(clicked()), this, SLOT(slotOpenFolder())); dirPath = QFileDialog::getExistingDirectory(this, tr("Please Select a Directory"), "", QFileDialog::ShowDirsOnly | QFileDialog::DontResolveSymlinks); folderEdit->setText(dirPath); QDir dir(dirPath);

然后读取该目录下所有可支持的图片:

QStringList filters; foreach (QByteArray format, QImageReader::supportedImageFormats()) filters += "*." + format; foreach (QString file, dir.entryList(filters, QDir::Files)){ files.append(file); filesList->addItem(file); }

并且浏览第一张图片:

if(!files.isEmpty()){ QImage image(dirPath + '/' + files.at(0)); imageLabel->setPixmap(QPixmap::fromImage(image)); imageLabel->adjustSize(); }

到这里,我们实现了打开目标文件夹并将目录下所有图像文件添加进来的功能。

 

为了实现点击不同的图片Item能达到切换图片进行观看的功能,首先连接信号和槽:

connect(filesList, SIGNAL(currentRowChanged(int)), this, SLOT(slotChangeImage(int)));

通过QListWidget当前Item的切换信号连接到切换图像的槽,具体代码如下:

void Topic::slotChangeImage(int i){ if(-1 == i) return; if(!files.isEmpty()){ QImage image(dirPath + '/' + files.at(i)); imageLabel->setPixmap(QPixmap::fromImage(image)); imageLabel->adjustSize(); } }

这就达到了切换浏览图片的目的了。

 

最后就是对所有图片进行水印处理了。

首先,要确保有用来水印的文字,markText就是此用途:

  if(markText->text() == ""){ QMessageBox::warning(this, tr("Warning"), tr("No text for marking")); return; }

在有水印文本的条件下,使用QPainter对象来对QImage这个QPaintDevice的子类的实例进行绘图,本质就是简单地使用一下drawText成员函数:

for(int i=0; i<files.size(); ++i){ QImage image(dirPath + '/' + files.at(i)); QPainter painter(&image); painter.setRenderHint(QPainter::Antialiasing, true); painter.setPen(QPen(Qt::blue, 20, Qt::SolidLine, Qt::RoundCap, Qt::RoundJoin)); painter.drawText(10, 10, markText->text()); image.save(dirPath + '/' + files.at(i)); } imageLabel->setPixmap(QPixmap::fromImage(QImage(dirPath + '/' + files.at(0)))); imageLabel->adjustSize();

在上面代码中,每次处理完一张图片都立即保存,而如果需要的话可以稍微改动下仅仅实现预览功能,待用户确认后再进行应用以及保存。

水印后的效果图如下:

由于本次的代码挺简单的,就不特地做上传了。

各位晚安!

目录
相关文章
|
4月前
|
数据可视化 图形学 C++
C++ Qt开发:Charts绘图组件概述
Qt 是一个跨平台C++图形界面开发库,利用Qt可以快速开发跨平台窗体应用程序,在Qt中我们可以通过拖拽的方式将不同组件放到指定的位置,实现图形化开发极大的方便了开发效率,本章将重点介绍`QCharts`二维绘图组件的常用方法及灵活运用。Qt Charts 提供了一个强大且易于使用的工具集,用于在 Qt 应用程序中创建各种类型的图表和图形可视化,该模块提供了多种类型的图表,包括折线图、散点图、条形图、饼图等。这使得开发人员能够轻松地将数据以直观的方式呈现给用户,增强应用程序的可视化效果。
48 0
C++ Qt开发:Charts绘图组件概述
|
5月前
|
编解码 图形学
29 QT - 绘图设备
29 QT - 绘图设备
17 0
|
存储 算法 数据可视化
Qt开发技术:Qt绘图系统(二)QPainter详解
Qt开发技术:Qt绘图系统(二)QPainter详解
Qt开发技术:Qt绘图系统(二)QPainter详解
|
存储 编解码 缓存
Qt开发技术:Qt绘图系统(一)绘图系统介绍
Qt开发技术:Qt绘图系统(一)绘图系统介绍
Qt开发技术:Qt绘图系统(一)绘图系统介绍
|
26天前
|
Linux API iOS开发
【Qt 渲染引擎】一文带你了解qt的三种 渲染引擎,包括栅格引擎(Raster)、OpenGL 和本地绘图系统
【Qt 渲染引擎】一文带你了解qt的三种 渲染引擎,包括栅格引擎(Raster)、OpenGL 和本地绘图系统
22 0
|
30天前
|
缓存 Linux 定位技术
Qt绘图指南:掌握高效、美观的GUI设计之道
Qt绘图指南:掌握高效、美观的GUI设计之道
88 1
|
3月前
Qt6学习笔记十三(绘图)
Qt6学习笔记十三(绘图)
37 0
|
7月前
|
C++ Python
Qt+C++基本绘图(画线,画圆,矩形, 撤销,重做)
Qt+C++基本绘图(画线,画圆,矩形, 撤销,重做)
147 0
Qt+C++基本绘图(画线,画圆,矩形, 撤销,重做)
|
7月前
|
C++ Python
Python+QT美颜工具源码
Python+QT美颜工具源码
118 0
Python+QT美颜工具源码
|
算法 C++
成为Qt绘图高手,你需要掌握这些
成为Qt绘图高手,你需要掌握这些