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文件操作整理汇总
Oct 21 Python
使用Python脚本将绝对url替换为相对url的教程
Apr 24 Python
Python实现查找系统盘中需要找的字符
Jul 14 Python
Python利用matplotlib生成图片背景及图例透明的效果
Apr 27 Python
python利用paramiko连接远程服务器执行命令的方法
Oct 16 Python
Python动态生成多维数组的方法示例
Aug 09 Python
Python从ZabbixAPI获取信息及实现Zabbix-API 监控的方法
Sep 17 Python
Python寻找两个有序数组的中位数实例详解
Dec 05 Python
python实现PCA降维的示例详解
Feb 24 Python
Python sql注入 过滤字符串的非法字符实例
Apr 03 Python
Python连接Impala实现步骤解析
Aug 04 Python
Python数据类型最全知识总结
May 31 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 可阅读随机字符串代码
2010/05/26 PHP
php curl的深入解析
2013/06/02 PHP
php实现的DateDiff和DateAdd时间函数代码分享
2014/08/16 PHP
PHP7正式版测试,性能惊艳!
2015/12/08 PHP
Joomla简单判断用户是否登录的方法
2016/05/04 PHP
PHP实现的简单对称加密与解密方法实例小结
2017/08/28 PHP
jquery pagination插件实现无刷新分页代码
2009/10/13 Javascript
JavaScript中的作用域链和闭包
2012/06/30 Javascript
JS+flash实现chrome和ie浏览器下同时可以复制粘贴
2013/09/22 Javascript
JQuery异步加载无限下拉框级联功能实现示例
2014/02/19 Javascript
jQuery插件Tooltipster实现漂亮的工具提示
2015/04/12 Javascript
BootStrap实现树形目录组件代码详解
2016/06/21 Javascript
将JSON字符串转换成Map对象的方法
2016/11/30 Javascript
Extjs 中的 Treepanel 实现菜单级联选中效果及实例代码
2017/08/22 Javascript
对Angular中单向数据流的深入理解
2018/03/31 Javascript
纯js封装的ajax功能函数与用法示例
2018/05/14 Javascript
微信小程序input框中加入小图标的实现方法
2018/06/19 Javascript
js获取 gif 的帧数的代码实例
2019/09/10 Javascript
VUE中使用HTTP库Axios方法详解
2020/02/05 Javascript
Electron+vue从零开始打造一个本地播放器的方法示例
2020/10/27 Javascript
[22:59]VGJ.S vs VG 2018国际邀请赛小组赛BO2 第二场 8.16
2018/08/17 DOTA
[47:43]Alliance vs KG 2019国际邀请赛小组赛 BO2 第一场 8.16
2019/08/18 DOTA
Python文件去除注释的方法
2015/05/25 Python
tensorflow 获取模型所有参数总和数量的方法
2018/06/14 Python
从numpy数组中取出满足条件的元素示例
2019/11/26 Python
Python logging模块进行封装实现原理解析
2020/08/07 Python
python 制作网站筛选工具(附源码)
2021/01/21 Python
浅谈css3中的前缀
2016/07/20 HTML / CSS
德国前卫设计师时装在线商店:Luxury Loft
2019/11/04 全球购物
大专学生推荐信范文
2013/11/19 职场文书
支部组织生活会方案
2014/06/10 职场文书
写给同学的新学期寄语
2015/02/27 职场文书
听证通知书
2015/04/24 职场文书
2016年学生会感恩节活动总结
2016/04/01 职场文书
2019开业庆典剪彩仪式主持词!
2019/07/22 职场文书
教你用Python matplotlib库制作简单的动画
2021/06/11 Python