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解析xml模块封装代码
Feb 07 Python
举例讲解Python中装饰器的用法
Apr 27 Python
python提取页面内url列表的方法
May 25 Python
Python使用正则表达式实现文本替换的方法
Apr 18 Python
Python编程之黑板上排列组合,你舍得解开吗
Oct 30 Python
在Python web中实现验证码图片代码分享
Nov 09 Python
完美解决Pycharm无法导入包的问题 Unresolved reference
May 18 Python
用xpath获取指定标签下的所有text的实例
Jan 02 Python
Python 实现两个服务器之间文件的上传方法
Feb 13 Python
解析Python3中的Import
Oct 13 Python
Python 爬虫实现增加播客访问量的方法实现
Oct 31 Python
Python logging模块异步线程写日志实现过程解析
Jun 30 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
DedeCms模板安装/制作概述
2007/03/11 PHP
PDO::beginTransaction讲解
2019/01/27 PHP
JavaScript 事件对象的实现
2009/07/13 Javascript
Jquery知识点三 jquery表单对象操作
2011/01/17 Javascript
一个基于jquery的文本框记数器
2012/09/19 Javascript
初识SmartJS - AOP三剑客
2014/06/08 Javascript
借助JavaScript脚本判断浏览器Flash Player信息的方法
2014/07/09 Javascript
jQuery学习笔记之创建DOM元素
2015/01/19 Javascript
js使用split函数按照多个字符对字符串进行分割的方法
2015/03/20 Javascript
js实现同一个页面多个渐变效果的方法
2015/04/10 Javascript
JavaScript实现弹出广告功能
2017/03/30 Javascript
详解nodejs操作mongodb数据库封装DB类
2017/04/10 NodeJs
JS对象和字符串之间互换操作实例分析
2019/02/02 Javascript
vue.js实现点击图标放大离开时缩小的代码
2021/01/27 Vue.js
[03:45]Newbee战队出征西雅图 决战2016国际邀请赛
2016/08/02 DOTA
python 基础学习第二弹 类属性和实例属性
2012/08/27 Python
使用scrapy实现爬网站例子和实现网络爬虫(蜘蛛)的步骤
2014/01/23 Python
Python selenium文件上传方法汇总
2020/11/19 Python
浅述python中argsort()函数的实例用法
2017/03/30 Python
python中print()函数的“,”与java中System.out.print()函数中的“+”功能详解
2017/11/24 Python
Vue的el-scrollbar实现自定义滚动
2018/05/29 Python
解决Ubuntu pip 安装 mysql-python包出错的问题
2018/06/11 Python
详解python中的json和字典dict
2018/06/22 Python
tensorflow使用指定gpu的方法
2020/02/04 Python
python GUI库图形界面开发之PyQt5控件数据拖曳Drag与Drop详细使用方法与实例
2020/02/27 Python
Python通过Schema实现数据验证方式
2020/11/12 Python
css3背景_动力节点Java学院整理
2017/07/11 HTML / CSS
CSS3 实现飘动的云朵动画
2020/12/01 HTML / CSS
小学毕业家长寄语
2014/01/19 职场文书
小学家长学校培训材料
2014/08/24 职场文书
2014年银行柜员工作总结
2014/11/12 职场文书
晚会闭幕词
2015/01/28 职场文书
委托收款证明
2015/06/23 职场文书
西部计划志愿者工作总结
2015/08/11 职场文书
600字作文之感受大自然
2019/11/27 职场文书
Java设计模式之享元模式示例详解
2022/03/03 Java/Android