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多进程编程
Jun 12 Python
django model去掉unique_together报错的解决方案
Oct 18 Python
Python实现读取文件最后n行的方法
Feb 23 Python
python爬虫实例详解
Jun 19 Python
Python反爬虫技术之防止IP地址被封杀的讲解
Jan 09 Python
python中的列表与元组的使用
Aug 08 Python
pandas DataFrame 数据选取,修改,切片的实现
Apr 24 Python
通过Python实现Payload分离免杀过程详解
Jul 13 Python
如何更换python默认编辑器的背景色
Aug 10 Python
PyQt5多线程防卡死和多窗口用法的实现
Sep 15 Python
分享3个非常实用的 Python 模块
Mar 03 Python
Python中非常使用的6种基本变量的操作与技巧
Mar 22 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 文章中的远程图片采集到本地的代码
2009/07/30 PHP
利用PHP扩展vld查看PHP opcode操作步骤
2013/03/04 PHP
用roll.js实现的图片自动滚动+鼠标触动的特效
2007/03/18 Javascript
JSON 编辑器实现代码
2009/12/06 Javascript
Javascript前端UI框架Kit使用指南之kitjs事件管理
2014/11/28 Javascript
JS闭包、作用域链、垃圾回收、内存泄露相关知识小结
2016/05/16 Javascript
微信小程序 swiper组件详解及实例代码
2016/10/25 Javascript
jquery popupDialog 使用 加载jsp页面的方法
2016/10/25 Javascript
jQuery实现自动调用和触发某个事件的方法
2016/11/18 Javascript
nuxt框架中路由鉴权之Koa和Session的用法
2018/05/09 Javascript
Angular6 Filter实现页面搜索的示例代码
2018/12/02 Javascript
Angular6 发送手机验证码按钮倒计时效果实现方法
2019/01/08 Javascript
浅谈目前可以使用ES10的5个新特性
2019/06/25 Javascript
vue在路由中验证token是否存在的简单实现
2019/11/11 Javascript
JS XMLHttpRequest原理与使用方法深入详解
2020/04/30 Javascript
[34:08]2018DOTA2亚洲邀请赛3月29日 小组赛B组 VP VS EG
2018/03/30 DOTA
python执行使用shell命令方法分享
2017/11/08 Python
使用Python来开发微信功能
2018/06/13 Python
linux安装Python3.4.2的操作方法
2018/09/28 Python
对python中大文件的导入与导出方法详解
2018/12/28 Python
python使用pygame模块实现坦克大战游戏
2020/03/25 Python
利用python、tensorflow、opencv、pyqt5实现人脸实时签到系统
2019/09/25 Python
在python中利用try..except来代替if..else的用法
2019/12/19 Python
Python 中的pygame安装与配置教程详解
2020/02/10 Python
Python脚本去除文件的只读性操作
2020/03/05 Python
python实现扫雷游戏的示例
2020/10/20 Python
python中random模块详解
2021/03/01 Python
美国购买汽车零件网站:Buy Auto Parts
2018/04/02 全球购物
公司活动策划方案
2014/01/13 职场文书
学生拾金不昧表扬信
2014/01/21 职场文书
自动一体化专业求职信
2014/03/15 职场文书
医院领导班子查摆问题对照检查材料思想汇报
2014/10/08 职场文书
我的中国梦心得体会范文
2016/01/05 职场文书
2016年优秀少先队员事迹材料
2016/02/26 职场文书
申论不会写怎么办?教您掌握这6点思维和原则
2019/07/17 职场文书
Python实现简单得递归下降Parser
2022/05/02 Python