使用Python编写批量添加图片水印程序:一、代码方案

栏目: Python · 发布时间: 5年前

内容简介:在互联网写文章最头疼的一件事情就是发表的文章容易被抄袭,各种抄袭的手段真的是层出不穷。无奈,只能在不影响阅读体验的情况下不断地提高反抄袭的难度。虽然防不住,但是为文章中的图片添加水印,至少能够保证文章被抄袭之后,读者还能知道文章的来源网站。在部分情况下,我们可以利用一些软件比如FastStone,快速截取一个带有水印的图片,如下图所示:

文章目录

  • 一、为什么要为图片添加水印
  • 二、利用 Python 为图片添加水印
    • 遍历文件夹下所有图片文件
  • 三、利用QT for Python制作图片水印添加程序

一、为什么要为图片添加水印

在互联网写文章最头疼的一件事情就是发表的文章容易被抄袭,各种抄袭的手段真的是层出不穷。无奈,只能在不影响阅读体验的情况下不断地提高反抄袭的难度。虽然防不住,但是为文章中的图片添加水印,至少能够保证文章被抄袭之后,读者还能知道文章的来源网站。

在部分情况下,我们可以利用一些软件比如FastStone,快速截取一个带有水印的图片,如下图所示:

使用Python编写批量添加图片水印程序:一、代码方案

这样的 工具 可以快速地为图片添加上水印图像。

但是如果我们有一批的图片,其并不是通过截图生成,这种情况下如果要对每一个图片添加水印,FastStone工具就有点无能为力了。

我们可以使用市面上的一些软件来实现:

使用Python编写批量添加图片水印程序:一、代码方案

但是这些软件,要么不免费,要么免费但是不安全,要么太繁琐。

索性,我们就用Python来完成一个图片水印批量添加程序的开发。

二、利用Python为图片添加水印

图片添加图片水印的原理其实很简单,在一个空白的画布上依次将原图像和水印添加添加进去即可。

在Python中,我们可以借助PIL模块轻松地实现图片水印的添加。

下面,我们通过代码来演示一下。

遍历文件夹下所有图片文件

首先我们需要获取一个目录下的所有文件,提取出其中的图像文件,这一步通过内置的os模块即可实现,代码如下所示:

import os
img_suffix_list = ['png', 'jpg', 'bmp']
for i in os.listdir(r"C:\Users\yang9\Desktop"):
    if i.split('.')[-1] in img_suffix_list:
        print(i)

运行上述代码,我们将获取选定目录下后缀名为png、jpg、bmp的图形文件,其效果如下图所示:

使用Python编写批量添加图片水印程序:一、代码方案

为图片添加图片水印

下面这一步,我们为图片添加图片水印。这一步需要借助的PIL的Image类来实现。

首先,读取原始图片和水印图片,并获取原始图片的大小,代码如下所示:

img = Image.open(img_file)  # 打开图片
watermark = Image.open(wm_file)  # 打开水印
img_size = img.size

然后我们新建一个图层,其大小为原始图片的大小,并将水印图片添加到图层上:

wm_position = (img_size[0]-wm_size[0],img_size[1]-wm_size[1]) # 默认设定水印位置为右下角
layer = Image.new('RGBA', img.size)  # 新建一个图层
layer.paste(watermark, wm_position)  # 将水印图片添加到图层上

接着,我们对图层和原始图片进行合成:

mark_img = Image.composite(layer, img, layer)

最后,调用save方法,将新图片保存到本地:

mark_img.save(save_path + new_file_name)

这样,一个添加了水印的图片就生成了。

我们将其整合为两个函数,方便调用,代码如下所示:

# coding:utf-8
# @文件: code_run.py
# @创建者:州的先生
# 博客地址:zmister.com

import os,traceback
from PIL import Image

# 获取文件夹图片
def get_folder(fpath,wm_file,save_path):
    try:
        img_suffix_list = ['png', 'jpg', 'bmp']
        for i in os.listdir(fpath):
            if i.split('.')[-1] in img_suffix_list:
                img_path = fpath + '/' + i
                img_water_mark(img_file=img_path,wm_file=wm_file,save_path=save_path)
    except Exception as e:
        print(traceback.print_exc())

# 图片添加水印
def img_water_mark(img_file, wm_file,save_path):
    try:
        img = Image.open(img_file)  # 打开图片
        watermark = Image.open(wm_file)  # 打开水印
        img_size = img.size
        wm_size = watermark.size
        # 如果图片大小小于水印大小
        if img_size[0] < wm_size[0]:
            watermark.resize(tuple(map(lambda x: int(x * 0.5), watermark.size)))
        print('图片大小:', img_size)
        wm_position = (img_size[0]-wm_size[0],img_size[1]-wm_size[1]) # 默认设定水印位置为右下角
        layer = Image.new('RGBA', img.size)  # 新建一个图层
        layer.paste(watermark, wm_position)  # 将水印图片添加到图层上
        mark_img = Image.composite(layer, img, layer)
        new_file_name = '/new_'+img_file.split('/')[-1]
        mark_img.save(save_path + new_file_name)
    except Exception as e:
        print(traceback.print_exc())

这样,我们通过一个函数get_folder(),指定图片的目录,水印图片的位置以及新图片保存的位置就可以了。运行代码,其效果如下动图所示:

使用Python编写批量添加图片水印程序:一、代码方案

去保存的目录看看具体的效果,都准确地添加了图片水印:

使用Python编写批量添加图片水印程序:一、代码方案

三、利用QT for Python制作图片水印添加程序

代码写好了之后,我们就可以很方便地借助其进行批量添加图片水印的操作了。虽然很方便,但是如果能够有一个图形用户界面的客户端程序供我们使用,那就更加好了。

在下一篇文章中,我们将介绍借助Python的PyQt5/PySide2,将批量添加图片水印的功能封装成一个桌面客户端程序。其效果如下动图所示:

使用Python编写批量添加图片水印程序:一、代码方案


以上所述就是小编给大家介绍的《使用Python编写批量添加图片水印程序:一、代码方案》,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对 码农网 的支持!

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

数据结构与算法分析(Java版)(英文原版)

数据结构与算法分析(Java版)(英文原版)

(美)Clifford A.Shaffer / 电子工业出版社 / 2002-5 / 39.00元

《数据结构与算法分析(C++版)(第2版)》采用程序员最爱用的面向对象C++语言来描述数据结构和算法,并把数据结构原理和算法分析技术有机地结合在一起,系统介绍了各种类型的数据结构和排序、检索的各种方法。作者非常注意对每一种数据结构的不同存储方法及有关算法进行分析比较。书中还引入了一些比较高级的数据结构与先进的算法分析技术,并介绍了可计算性理论的一般知识。本版的重要改进在于引入了参数化的模板,从而提......一起来看看 《数据结构与算法分析(Java版)(英文原版)》 这本书的介绍吧!

CSS 压缩/解压工具
CSS 压缩/解压工具

在线压缩/解压 CSS 代码

XML 在线格式化
XML 在线格式化

在线 XML 格式化压缩工具

RGB HSV 转换
RGB HSV 转换

RGB HSV 互转工具