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 相关文章推荐
深入讲解Java编程中类的生命周期
Feb 05 Python
Django的HttpRequest和HttpResponse对象详解
Jan 26 Python
简单了解python单例模式的几种写法
Jul 01 Python
python hough变换检测直线的实现方法
Jul 12 Python
python中有关时间日期格式转换问题
Dec 25 Python
python PIL/cv2/base64相互转换实例
Jan 09 Python
python清空命令行方式
Jan 13 Python
PyCharm 2020.1版安装破解注册码永久激活(激活到2089年)
Sep 24 Python
Anaconda+spyder+pycharm的pytorch配置详解(GPU)
Oct 18 Python
python调用win32接口进行截图的示例
Nov 11 Python
分析Python感知线程状态的解决方案之Event与信号量
Jun 16 Python
Python图像处理库PIL详细使用说明
Apr 06 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数组对百万数据进行排除重复数据的实现代码
2010/06/08 PHP
PHP实用函数分享之去除多余的0
2015/02/06 PHP
php求数组全排列,元素所有组合的方法总结
2017/03/14 PHP
PHP基于rabbitmq操作类的生产者和消费者功能示例
2018/06/16 PHP
php使用环形链表解决约瑟夫问题完整示例
2018/08/07 PHP
php ZipArchive实现多文件打包下载实例
2019/10/31 PHP
jquery移动端TAB触屏切换实现效果
2020/12/22 Javascript
javascript超过容器后显示省略号效果的方法(兼容一行或者多行)
2016/07/14 Javascript
使用jQuery调用XML实现无刷新即时聊天
2016/08/07 Javascript
新闻上下滚动jquery 超简洁(必看篇)
2017/01/21 Javascript
JSON的parse()方法介绍
2019/01/31 Javascript
简单了解node npm cnpm的具体使用方法
2019/02/27 Javascript
Vue.js标签页组件使用方法详解
2019/10/19 Javascript
vue中是怎样监听数组变化的
2020/10/24 Javascript
利用 Chrome Dev Tools 进行页面性能分析的步骤说明(前端性能优化)
2021/02/24 Javascript
在Python中定义和使用抽象类的方法
2016/06/30 Python
Pandas GroupBy对象 索引与迭代方法
2018/11/16 Python
python-django中的APPEND_SLASH实现方法
2019/06/21 Python
python实现比对美团接口返回数据和本地mongo数据是否一致示例
2019/08/09 Python
python retrying模块的使用方法详解
2019/09/25 Python
python 正则表达式参数替换实例详解
2020/01/17 Python
python 实现关联规则算法Apriori的示例
2020/09/30 Python
python调用百度API实现人脸识别
2020/11/17 Python
python遍历路径破解表单的示例
2020/11/21 Python
scrapy-splash简单使用详解
2021/02/21 Python
Nike德国官网:Nike.com (DE)
2018/11/13 全球购物
如何设置Java的运行环境
2013/04/05 面试题
领导视察欢迎词
2014/01/15 职场文书
写给学生的新学期寄语
2014/01/18 职场文书
中式餐厅创业计划书范文
2014/01/23 职场文书
校园安全检查制度
2014/02/03 职场文书
烹饪大赛策划方案
2014/05/26 职场文书
计算机系本科生求职信
2014/05/31 职场文书
2014年民主评议党员工作总结
2014/12/02 职场文书
因公司原因离职的辞职信范文
2015/05/12 职场文书
漫画《尖帽子的魔法工坊》宣布动画化
2022/04/06 日漫