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动态加载模块的3种方法
Nov 22 Python
python使用celery实现异步任务执行的例子
Aug 28 Python
调试Django时打印SQL语句的日志代码实例
Sep 12 Python
Python OpenCV图像指定区域裁剪的实现
Oct 30 Python
wxPython实现文本框基础组件
Nov 18 Python
Python中url标签使用知识点总结
Jan 16 Python
django 文件上传功能的相关实例代码(简单易懂)
Jan 22 Python
浅谈Django中的QueryDict元素为数组的坑
Mar 31 Python
Pytorch转onnx、torchscript方式
May 25 Python
Python importlib模块重载使用方法详解
Oct 13 Python
python 如何读、写、解析CSV文件
Mar 03 Python
Django数据库(SQlite)基本入门使用教程
Jul 07 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 cron中的批处理
2008/09/16 PHP
PHP中的表达式简述
2016/05/29 PHP
PHP记录和读取JSON格式日志文件
2016/07/07 PHP
php基于协程实现异步的方法分析
2019/07/17 PHP
php多进程并发编程防止出现僵尸进程的方法分析
2020/02/28 PHP
javascript的onchange事件与jQuery的change()方法比较
2009/09/28 Javascript
JavaScript Title、alt提示(Tips)实现源码解读
2010/12/12 Javascript
jQuery循环滚动展示代码 可应用到文字和图片上
2012/05/11 Javascript
用原生JavaScript实现jQuery的$.getJSON的解决方法
2013/05/03 Javascript
JavaScript实现的内存数据库LokiJS介绍和入门实例
2014/11/17 Javascript
javascript实现无限级select联动菜单
2015/01/02 Javascript
JavaScript使用concat连接数组的方法
2015/04/06 Javascript
在Node.js应用中使用Redis的方法简介
2015/06/24 Javascript
javascript弹出拖动窗口
2015/08/11 Javascript
JavaScript类型系统之布尔Boolean类型详解
2016/06/26 Javascript
JQ选择器_选择同类元素的第N个子元素的实现方法
2016/09/08 Javascript
一个非常好用的文字滚动的案例,鼠标悬浮可暂停[两种方案任选]
2016/12/01 Javascript
js实现移动端轮播图
2020/12/21 Javascript
vue实现的上拉加载更多数据/分页功能示例
2019/05/25 Javascript
JavaScript实现模态对话框实例
2020/01/13 Javascript
React中Ref 的使用方法详解
2020/04/28 Javascript
JS如何监听div的resize事件详解
2020/12/03 Javascript
python logging类库使用例子
2014/11/22 Python
Python入门之三角函数atan2()函数详解
2017/11/08 Python
postman模拟访问具有Session的post请求方法
2019/07/15 Python
解决Python正则表达式匹配反斜杠''\''问题
2019/07/17 Python
python计算波峰波谷值的方法(极值点)
2020/02/18 Python
Django多层嵌套ManyToMany字段ORM操作详解
2020/05/19 Python
python实现扫雷游戏的示例
2020/10/20 Python
Scrapy+Selenium自动获取cookie爬取网易云音乐个人喜爱歌单
2021/02/01 Python
丹麦优惠购物网站:PLUSSHOP
2019/03/24 全球购物
什么是servlet链?
2014/07/13 面试题
企业厂务公开实施方案
2014/03/26 职场文书
行政秘书工作自我鉴定
2014/09/15 职场文书
2015年重阳节活动主持词
2015/07/30 职场文书
离婚协议书范文2016
2016/03/18 职场文书