Python实现图片批量加入水印代码实例


Posted in Python onNovember 30, 2019

这篇文章主要介绍了Python实现图片批量加入水印代码实例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下

写文章的时候可以设置是否添加水印。可是,有些图片可能想加水印,有些不想加水印,该怎么办呢?

配置环境

python3 + pillow

pip3 install pillow

引入库

from PIL import Image, ImageSequence
import os
import random

效果预览:

Python实现图片批量加入水印代码实例

使用方法:

  • 在脚本同目录下添加水印图片 logo.png
  • 创建目录 input 并在放入要添加水印的图片
  • 创建目录 output 执行脚本 addlogo.py
  • 结果输出在 output 文件夹下

Python实现图片批量加入水印代码实例

实现原理

水印图片采集:

先读取水印图片的像素点信息和大小信息。去除透明度为0的像素,并修改透明度像素信息。

img_logo = Image.open("logo.png")
img_logo_width, img_logo_height = img_logo.size
img_logo_pixels = dict()
for w in range(img_logo_width):
  for h in range(img_logo_height):
    c = img_logo.getpixel((w,h))
    if c!=(0, 0, 0, 0):
      img_logo_pixels[(w, h)] = c[:3]+(125,)

混合颜色:

对每一个像素点采取颜色混合,其中c1是源图片的像素点信息(r,g,b,a),c2是logo图片像素点的信息。混合算法如下:

def blendPixel(c1,c2):
  a1=256-c2[3]
  a2=c2[3]-(a1*c2[3])/256.0
  a=a1+a2
  c=(int((a1*c1[0] + a2*c2[0])/a), int((a1*c1[1] + a2*c2[1])/a), int((a1*c1[2] + a2*c2[2])/a),int(a))
  return c

处理源 Image 对象:

随机一个位置开始处理像素,具体代码参考如下。

def dealOneImage(image,offX=None,offY=None):
  w, h = image.size
  offX = offX if offX else random.random();
  offY = offY if offY else random.random();
  #如果图片尺寸小于水印图片,不加水印
  if w>=img_logo_width and h>=img_logo_height:
    top = int((w - img_logo_width)*offX)
    left = int((h - img_logo_height)*offY)
    for p, c in img_logo_pixels.items():
      p_x = (p[0]+top)
      p_y = (p[1]+left)
      image_c = image.getpixel((p_x,p_y))
      if(isinstance(image_c, tuple) and len(image_c)>2):
        image.putpixel((p_x, p_y), blendPixel(image_c,c))
  return image;

处理单个文件:

对于 gif 文件先拆成一张一张图片,在图片上添加水印,最后再合成 gif 。对于其他格式的图片文件可以多添加几个水印。最后输出保存到 output 文件夹下。

def dealOneFile(filePath):
  img_orign = Image.open(filePath)
  _,file_type = os.path.splitext(filePath)
  basename = os.path.basename(filePath)
  if file_type == '.gif':
    sequence = [];
    offX=random.random()
    offY=random.random()
    for f in ImageSequence.Iterator(img_orign):
      if len(sequence) % 2 == 0:
        offX=random.random()
        offY=random.random()
      sequence.append(dealOneImage(f.convert(),offX,offY))
    sequence[0].save(f'./output/{basename}', save_all=True, append_images=sequence[1:])
  else:
    image_out = (dealOneImage(img_orign))
    for x in range(1):
      image_out = (dealOneImage(image_out))
    image_out.save(f'./output/{basename}')

处理目录:

对当前目录下的文件做一个筛选,只选取图片格式的文件。

def dealSrc(srcDir):
  picFiles = [os.path.join(srcDir,fn) for fn in os.listdir(srcDir) if fn.endswith(('.gif', '.jpg', '.png','.jpeg'))]
  for filePath in picFiles:
    dealOneFile(filePath)

小结

添加水印主要用了 python3 中的 pillow 库来实现。 首先是读取 logo 图片信息,接着在随机一个位置添加混合后的像素点信息,最后再保存起来。

其中,对于 gif 文件的处理是拆帧,再添加水印,最后再组合成一个 gif。这个只能对应比较小的 gif 文件处理,如果有更好的方法欢迎留言交流分享!

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
Python生成不重复随机值的方法
May 11 Python
Python实现分割文件及合并文件的方法
Jul 10 Python
Python正则表达式教程之一:基础篇
Mar 02 Python
Python动刷新抢12306火车票的代码(附源码)
Jan 24 Python
Python 做曲线拟合和求积分的方法
Dec 29 Python
pyqt 实现为长内容添加滑轮 scrollArea
Jun 19 Python
Django框架之登录后自定义跳转页面的实现方法
Jul 18 Python
pycharm第三方库安装失败的问题及解决经验分享
May 09 Python
django中嵌套的try-except实例
May 21 Python
python中requests库+xpath+lxml简单使用
Apr 29 Python
基于tensorflow权重文件的解读
May 26 Python
PyMongo 查询数据的实现
Jun 28 Python
Python实现把多维数组展开成DataFrame
Nov 30 #Python
Python散点图与折线图绘制过程解析
Nov 30 #Python
Python OpenCV视频截取并保存实现代码
Nov 30 #Python
解决os.path.isdir() 判断文件夹却返回false的问题
Nov 29 #Python
windows环境中利用celery实现简单任务队列过程解析
Nov 29 #Python
基于Python中isfile函数和isdir函数使用详解
Nov 29 #Python
python os.path.isfile 的使用误区详解
Nov 29 #Python
You might like
五款PHP代码重构工具推荐
2014/10/14 PHP
yii2中关于加密解密的那些事儿
2018/06/12 PHP
Prototype Object对象 学习
2009/07/12 Javascript
jQuery UI AutoComplete 使用说明
2011/06/20 Javascript
仿中关村在线首页弹出式广告插件(jQuery版)
2012/05/03 Javascript
给文字加上着重号的JS代码
2013/11/12 Javascript
自己编写的支持Ajax验证的JS表单验证插件
2015/05/15 Javascript
jQuery随手笔记之常用的jQuery操作DOM事件
2015/11/29 Javascript
Vue.js每天必学之方法与事件处理器
2016/09/06 Javascript
如何实现json数据可视化详解
2016/11/24 Javascript
JavaScript数组操作详解
2017/02/04 Javascript
vue项目前端埋点的实现
2019/03/06 Javascript
Python CSV模块使用实例
2015/04/09 Python
python中的错误处理
2016/04/10 Python
Python端口扫描简单程序
2016/11/10 Python
Python selenium使用autoIT上传附件过程详解
2020/05/26 Python
Python中flatten( ),matrix.A用法说明
2020/07/05 Python
Python3如何实现Win10桌面自动切换
2020/08/11 Python
John Hardy官方网站:手工设计首饰的奢侈品牌
2017/07/05 全球购物
购房委托书范本
2014/09/18 职场文书
2014年纪检部工作总结
2014/11/12 职场文书
2015年度党员自我评价范文
2015/03/03 职场文书
寒假社会实践个人总结
2015/03/06 职场文书
2015年学校工作总结范文
2015/04/20 职场文书
通知的格式范文
2015/04/27 职场文书
交通处罚决定书
2015/06/24 职场文书
2015年语言文字工作总结
2015/07/23 职场文书
运动会跳远广播稿
2015/08/19 职场文书
2016领导干部廉洁从政心得体会
2016/01/19 职场文书
《丑小鸭》教学反思
2016/02/19 职场文书
2016年八一建军节活动总结
2016/04/05 职场文书
导游词之苏州阳澄湖
2019/11/15 职场文书
mysql升级到5.7时,wordpress导数据报错1067的问题
2021/05/27 MySQL
python 爬取哔哩哔哩up主信息和投稿视频
2021/06/07 Python
解决pycharm安装scrapy DLL load failed:找不到指定的程序的问题
2021/06/08 Python
PostgreSQL数据库创建并使用视图以及子查询
2022/04/11 PostgreSQL