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单链表实现代码实例
Nov 21 Python
从零学python系列之教你如何根据图片生成字符画
May 23 Python
python实现的简单FTP上传下载文件实例
Jun 30 Python
50行Python代码实现人脸检测功能
Jan 23 Python
python实现京东秒杀功能
Jul 30 Python
spark dataframe 将一列展开,把该列所有值都变成新列的方法
Jan 29 Python
python获取地震信息 微信实时推送
Jun 18 Python
Python+OpenCV+pyQt5录制双目摄像头视频的实例
Jun 28 Python
Python操作注册表详细步骤介绍
Feb 05 Python
基于plt.title无法显示中文的快速解决
May 16 Python
详解Pycharm第三方库的安装及使用方法
Dec 29 Python
python必学知识之文件操作(建议收藏)
May 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
一个PHP日历程序
2006/12/06 PHP
discuz Passport 通行证 整合笔记
2008/06/30 PHP
PHP编码转换函数 自动转换字符集支持数组转换
2012/12/16 PHP
PHP生成随机用户名和密码的实现代码
2013/02/27 PHP
PHP根据图片色界在不同位置加水印的方法
2015/07/01 PHP
Laravel5.1 框架响应基本用法实例分析
2020/01/04 PHP
实例:用 JavaScript 来操作字符串(一些字符串函数)
2007/02/15 Javascript
jquery 输入框数字限制插件
2009/11/10 Javascript
JQuery为textarea添加maxlength属性的代码
2010/04/07 Javascript
过虑特殊字符输入的js代码
2010/08/05 Javascript
js中获取事件对象的方法小结
2011/03/13 Javascript
浅谈checkbox的一些操作(实战经验)
2013/11/20 Javascript
特殊日期提示功能的实现方法
2016/06/16 Javascript
遍历json 对象的属性并且动态添加属性的实现
2016/12/02 Javascript
非常实用的vue导航钩子
2017/03/20 Javascript
nodejs实现的简单web服务器功能示例
2018/03/15 NodeJs
Vue $attrs & inheritAttr实现button禁用效果案例
2020/12/07 Vue.js
[02:51]2014DOTA2 TI小组赛总结中国军团全部进军钥匙球馆
2014/07/15 DOTA
在Django的模板中使用认证数据的方法
2015/07/23 Python
win7+Python3.5下scrapy的安装方法
2018/07/31 Python
python tornado使用流生成图片的例子
2019/11/18 Python
python pygame实现挡板弹球游戏
2019/11/25 Python
VScode连接远程服务器上的jupyter notebook的实现
2020/04/23 Python
python中count函数知识点浅析
2020/12/17 Python
pyx文件 生成pyd 文件用于 cython调用的实现
2021/03/04 Python
html5如何在Canvas中实现自定义路径动画示例
2017/09/18 HTML / CSS
加拿大时尚床上用品零售商:QE Home | Quilts Etc
2018/01/22 全球购物
什么是Rollback Segment
2013/04/22 面试题
能否解释一下XSS cookie盗窃是什么意思
2012/06/02 面试题
酒店司机岗位职责
2013/12/14 职场文书
工程专业应届生求职信
2014/02/19 职场文书
期末学生评语大全
2014/04/24 职场文书
公司法人授权委托书范本
2014/09/12 职场文书
群众路线领导班子四风对照检查材料
2014/09/27 职场文书
2014年个人售房协议书
2014/10/30 职场文书
导游词之江南园林狮子林
2019/09/16 职场文书