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 相关文章推荐
wxPython定时器wx.Timer简单应用实例
Jun 03 Python
python数据结构之图的实现方法
Jul 08 Python
Python的Tornado框架实现异步非阻塞访问数据库的示例
Jun 30 Python
Python编码类型转换方法详解
Jul 01 Python
Python读取图片属性信息的实现方法
Sep 11 Python
Python入门之三角函数全解【收藏】
Nov 08 Python
Pandas中把dataframe转成array的方法
Apr 13 Python
python中找出numpy array数组的最值及其索引方法
Apr 17 Python
Python中关键字global和nonlocal的区别详解
Sep 03 Python
PyQt5事件处理之定时在控件上显示信息的代码
Mar 25 Python
解析Tensorflow之MNIST的使用
Jun 30 Python
python数据可视化使用pyfinance分析证券收益示例详解
Nov 20 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 urlencode()与urldecode()函数字符编码原理详解
2011/12/06 PHP
Smarty的配置与高级缓存技术分享
2012/06/05 PHP
Thinkphp多文件上传实现方法
2014/10/31 PHP
PHP入门教程之会话控制技巧(cookie与session)
2016/09/11 PHP
JavaScript 对象成员的可见性说明
2009/10/16 Javascript
JavaScript实现自己的DOM选择器原理及代码
2013/03/04 Javascript
jquery实现的一个导航滚动效果具体代码
2013/05/27 Javascript
JS调用CS里的带参方法实例
2013/08/01 Javascript
javascript获取url上某个参数的方法
2013/11/08 Javascript
NodeJS学习笔记之Connect中间件模块(二)
2015/01/27 NodeJs
基于Jquery+div+css实现弹出登录窗口(代码超简单)
2015/10/27 Javascript
JavaScript调用传递变量参数的相关问题及解决办法
2015/11/01 Javascript
js文字横向滚动特效
2015/11/11 Javascript
移动端翻页插件dropload.js(支持Zepto和jQuery)
2016/07/27 Javascript
nodeJS实现路由功能实例代码
2017/06/08 NodeJs
详解从Vue.js源码看异步更新DOM策略及nextTick
2017/10/11 Javascript
vue.js学习笔记之v-bind和v-on解析
2018/05/03 Javascript
JavaScript求一组数的最小公倍数和最大公约数常用算法详解【面向对象,回归迭代和循环】
2018/05/07 Javascript
使用vue.js在页面内组件监听scroll事件的方法
2018/09/11 Javascript
原生javascript实现类似vue的数据绑定功能示例【观察者模式】
2020/02/24 Javascript
基于vue+echarts 数据可视化大屏展示的方法示例
2020/03/09 Javascript
使用python为mysql实现restful接口
2018/01/05 Python
详谈Python 窗体(tkinter)表格数据(Treeview)
2018/10/11 Python
一行python实现树形结构的方法
2019/08/09 Python
python 一篇文章搞懂装饰器所有用法(建议收藏)
2019/08/23 Python
python自动脚本的pyautogui入门学习
2020/04/01 Python
GitHub上值得推荐的8个python 项目
2020/10/30 Python
FILA斐乐中国官方商城:意大利运动品牌
2017/01/25 全球购物
英国厨房与餐具用品为主的设计品牌:Joseph Joseph
2018/04/26 全球购物
Under Armour瑞典官方网站:美国高端运动科技品牌
2018/11/21 全球购物
学习普通话的体会
2014/11/07 职场文书
2014年乡镇卫生院工作总结
2014/11/24 职场文书
生产车间管理制度
2015/08/04 职场文书
公务员爱岗敬业心得体会
2016/01/25 职场文书
mysql的MVCC多版本并发控制的实现
2021/04/14 MySQL
Python中的 No Module named ***问题及解决
2022/07/23 Python