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

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

作者:Jason Lee

日期:2010-05-02

平台:Qt SDK v2010.02.1 + Windows Xp

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

 

[1]二维绘图概览

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

使用QPainter可以在绘图设备上进行绘制以下类的实例:QImage、QBitmap、QIcon、QPixmap、QPicture等各种图像和QPoint、QLine、QPolygon等各种图形以及其它许多,难以列举。

目前QPaintDevice的子类有QWidget、QGLWidget、QImage、QPixmap、QGLPixelBuffer、QGLFrameBufferObject、QPicture、QPrinter。也就是说,可以使用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();

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

水印后的效果图如下:

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

各位晚安!

时间: 2024-10-24 17:44:36

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

在java中定义了一个二维数组,这样做好像不对,输出时报错, 代码如下

问题描述 在java中定义了一个二维数组,这样做好像不对,输出时报错, 代码如下 我是想要定义一个二维数组,然后动态地给它赋值,应该怎么做不知道问题出在做么地方,请大神指导一下 ,代码如下: int[][] a = null; a[1] = new int[]{1,2,3}; System.out.println(a[1][1]); 解决方案 int[][] a = null; a = new int[5][];//第一维需要初始化 a[1] = new int[]{1,2,3};//这是第二维

app 二维码-QT 实现二维码扫描功能

问题描述 QT 实现二维码扫描功能 我正用QT quick做一个android手机APP,要实现一个二维码扫描功能,,需要怎么实现 解决方案 http://bbs.csdn.net/topics/390650017 解决方案二: 调用摄像头可以用OpenCV或者Directshow,然后就是读每一帧,对每一帧的图进行二维码的识别

c# vs2008 的.rdlc报表里面加入动态二维码怎么做

问题描述 c#vs2008的.rdlc报表里面加入二维码怎么做我做的是一个电子商务,订货系统,主要是想实现,送货完成后,通过打印上的二维码稍描,来确定订单送货已到,修改订单状态 解决方案

Agg vs. Cairo 二维绘图引擎之比较和选择 .

Agg vs. Cairo 二维绘图引擎之比较和选择 cheungmine 当今时代对于作为二维图形软件开发者, 是幸运的.因为除了Windows GDI/GDI+之外,我们还有很多其他的选择.而且这些选择除了能跨平台之外,性能上与原始GDI/GDI+相比,都不逊色. 如果不考虑绘图的效果,使用Win32 GDI函数直接绘图的效率大约是同样的GDI Plus的10倍以上.为了反走样的美观,只有牺牲效率了.老式的程序还在使用GDI绘图,不是这些程序不想提升到GDI+,可能这样改动的代码量太大,所谓

《MATLAB图像处理375例》——第2章 MATLAB图形的可视化 2.1 二维绘图

第2章 MATLAB图形的可视化 MATLAB图像处理375例数据可视化是MATLAB一项重要的功能.MATLAB所提供的丰富绘图功能,使得工程科研人员从繁琐的绘图细节中脱离出来,并专注于最关心的本质.通过数据可视化的方法,工程科研人员可以对样本数据的分布.趋势特性有一个直观的了解. 2.1 二维绘图 MATLAB图像处理375例在MATLAB中绘制二维图形,通常采用以下步骤. (1)准备数据. (2)设置当前绘图区. (3)绘制图形. (4)设置图形中曲线和标记点格式. (5)设置坐标轴和网格

做一个简单的VC++的mfc单文档应用程序

问题描述 做一个简单的VC++的mfc单文档应用程序 帮忙做一个基于VC++6.0的mfc单文档应用程序(绘图),有菜单栏工具栏和快捷菜单,用到分割窗口,组合框,文档序列化 解决方案 google Scribble 示例:MDI 绘图应用程序 解决方案二: 就你的需求,不要写一行程序,用向导生成,勾选切分视图和从CFormView继承,放上组合框就好了.文档序列化是默认支持的. 解决方案三: 解决方案四: 如果你要画图,可以直接下载msdn里面切分视图画图的那个例子,然后加上一个controlb

源码-用javaSSH框架做一个简单的登录功能

问题描述 用javaSSH框架做一个简单的登录功能 用SSH框架做一个简单的登录功能,登录成功则跳转到一个页面,登录失败则跳转到一个失败页面,MySQL数据库.求大神指点,最好能提供源码 解决方案 Spring 3.x 企业应用开发实战的第一个例子就符合你的要求了.Mysql+srping3 解决方案二: 告诉我你的扣扣邮箱,我发你邮箱 解决方案三: 主要还是在struts2 里面,处理业务逻辑,再跳转到指定页面,关键在struts,xml配置文件里面

用php做一个简单的表单

PHP最有用的特性之一是它能够自动将表单中的变量值赋予PHP变量.这使得表单处理变得非常快捷. 因此,如果你送出一个内含输入栏位值的表单如下: <INPUT TYPE=TEXT NAME="name" VALUE="Glen Morris"> 当你用PHP处理此页面,$name变量的值就会是 Glen Morris. 因此,你可以用如下的方式把值打印出来: echo "Hi $name!"; 或者像这样测试其值: if ($name

php对二维数组进行排序的简单实例

 这篇文章主要介绍了php对二维数组进行排序的简单实例,有需要的朋友可以参考一下 本文介绍下,php中使用array_multisort函数进行二维数组排序的例子,有需要的朋友,参考下吧.继上一篇文章:PHP二维数组排序自定义函数,今天,我们再介绍一个php二维数组排序的例子. php对二维数组的排序很简单,主要用到array_multisort函数. 例子:   代码如下: <?php  /**  * php二维数组排序  * edit www.jb51.net */      $data =