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的Flask框架开发环境的一些技巧总结
Jul 12 Python
Python3.5局部变量与全局变量作用域实例分析
Apr 30 Python
解决Python正则表达式匹配反斜杠''\''问题
Jul 17 Python
python opencv 简单阈值算法的实现
Aug 04 Python
vue学习笔记之动态组件和v-once指令简单示例
Feb 29 Python
Python3 hashlib密码散列算法原理详解
Mar 30 Python
Python应用实现处理excel数据过程解析
Jun 19 Python
python如何代码集体右移
Jul 20 Python
Python描述数据结构学习之哈夫曼树篇
Sep 07 Python
python中round函数保留两位小数的方法
Dec 04 Python
用python读取xlsx文件
Dec 17 Python
python UDF 实现对csv批量md5加密操作
Jan 01 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
改造一台复古桌面收音机
2021/03/02 无线电
阿里云PHP SMS短信服务验证码发送方法
2017/07/11 PHP
thinkPHP5.1框架使用SemanticUI实现分页功能示例
2019/08/03 PHP
js href的用法
2010/05/13 Javascript
js跨域问题之跨域iframe自适应大小实现代码
2010/07/17 Javascript
JavaScript 选中文字并响应获取的实现代码
2011/08/28 Javascript
js捕获鼠标右键菜单中的粘帖事件实现代码
2013/04/01 Javascript
ExtJS下书写动态生成的xml(兼容火狐)
2013/04/02 Javascript
jquery ui对话框实例代码
2013/05/10 Javascript
javascript在myeclipse中报错的解决方法
2013/10/29 Javascript
JavaScript在IE和FF下的兼容性问题
2014/05/19 Javascript
Javascript让DEDECMS告别手写Tag
2014/09/01 Javascript
jQuery插件formValidator自定义函数扩展功能实例详解
2015/11/25 Javascript
获取jqGrid中选择的行的数据
2016/11/30 Javascript
详解基于 axios 的 Vue 项目 http 请求优化
2017/09/04 Javascript
JS排序算法之希尔排序与快速排序实现方法
2017/12/12 Javascript
Angular4学习教程之DOM属性绑定详解
2018/01/04 Javascript
创建echart多个联动的示例代码
2018/11/23 Javascript
谈谈JavaScript中的函数
2020/09/08 Javascript
详解node.js创建一个web服务器(Server)的详细步骤
2021/01/15 Javascript
[31:33]2014 DOTA2国际邀请赛中国区预选赛 TongFu VS DT 第一场
2014/05/23 DOTA
[51:26]VP vs VG 2018国际邀请赛小组赛BO2 第二场 8.19
2018/08/21 DOTA
Python中super()函数简介及用法分享
2016/07/11 Python
使用Eclipse如何开发python脚本
2018/04/11 Python
PyQt5实现无边框窗口的标题拖动和窗口缩放
2018/04/19 Python
python中不能连接超时的问题及解决方法
2018/06/10 Python
NLTK 3.2.4 环境搭建教程
2018/09/19 Python
使用python采集脚本之家电子书资源并自动下载到本地的实例脚本
2018/10/23 Python
Pycharm使用之设置代码字体大小和颜色主题的教程
2019/07/12 Python
python3-flask-3将信息写入日志的实操方法
2019/11/12 Python
Python处理PDF与CDF实例
2020/02/26 Python
亚马逊墨西哥站:Amazon.com.mx
2018/08/26 全球购物
什么是典型的软件三层结构?软件设计为什么要分层?软件分层有什么好处?
2012/03/14 面试题
this关键字的作用
2016/01/30 面试题
注塑工厂厂长岗位职责
2013/12/02 职场文书
关于有小孩的离婚协议书
2014/10/26 职场文书