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复制与引用用法分析
Apr 08 Python
python脚本内运行linux命令的方法
Jul 02 Python
基于python的七种经典排序算法(推荐)
Dec 08 Python
python中解析json格式文件的方法示例
May 03 Python
Python基于numpy灵活定义神经网络结构的方法
Aug 19 Python
Python入门之后再看点什么好?
Mar 05 Python
关于Pytorch的MNIST数据集的预处理详解
Jan 10 Python
Python django框架开发发布会签到系统(web开发)
Feb 12 Python
Python中if有多个条件处理方法
Feb 26 Python
python中的django是做什么的
Jul 31 Python
python 爬取B站原视频的实例代码
Sep 09 Python
python如何获取网络数据
Apr 11 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面向对象的方法重载两种版本比较
2008/09/08 PHP
无需重新编译php加入ftp扩展的解决方法
2013/02/07 PHP
几道坑人的PHP面试题 试试看看你会不会也中招
2014/08/19 PHP
php实现将base64格式图片保存在指定目录的方法
2016/10/13 PHP
php+croppic.js实现剪切上传图片功能
2018/08/14 PHP
详解PHP 二维数组排序保持键名不变
2019/03/06 PHP
php设计模式之模板模式实例分析【星际争霸游戏案例】
2020/03/24 PHP
jQuery中与toggleClass等价的程序段 以及未来学习的方向
2010/03/18 Javascript
Extjs中TabPane如何嵌套在其他网页中实现思路及代码
2013/01/27 Javascript
关闭浏览器窗口弹出提示框并且可以控制其失效
2014/04/15 Javascript
纯javascript实现四方向文本无缝滚动效果
2015/06/16 Javascript
微信小程序 实战小程序实例
2016/10/08 Javascript
webix+springmvc session超时跳转登录页面
2016/10/30 Javascript
基于jQuery实现左侧菜单栏可折叠功能
2016/12/27 Javascript
vue2.0父子组件及非父子组件之间的通信方法
2017/01/21 Javascript
js 两个日期比较相差多少天的实例
2017/10/19 Javascript
vue中实现图片和文件上传的示例代码
2018/03/16 Javascript
Vue验证码60秒倒计时功能简单实例代码
2018/06/22 Javascript
jquery获取并修改触发事件的DOM元素示例【基于target 属性】
2019/10/10 jQuery
Vue路由对象属性 .meta $route.matched详解
2019/11/04 Javascript
python抓取京东商城手机列表url实例代码
2013/12/18 Python
Python中replace方法实例分析
2014/08/20 Python
Python实现从URL地址提取文件名的方法
2015/05/15 Python
Python新手入门最容易犯的错误总结
2017/04/24 Python
对Python中type打开文件的方式介绍
2018/04/28 Python
centos 安装Python3 及对应的pip教程详解
2019/06/28 Python
用python写测试数据文件过程解析
2019/09/25 Python
python保存log日志,实现用log日志画图
2019/12/24 Python
python对批量WAV音频进行等长分割的方法实现
2020/09/25 Python
PHP面试题大全
2015/10/16 面试题
化工机械应届生求职信
2013/11/04 职场文书
电气个人求职信范文
2014/02/04 职场文书
报关员个人职业生涯规划书
2014/03/12 职场文书
2015年度绩效考核工作总结
2015/05/27 职场文书
宾馆安全管理制度
2015/08/06 职场文书
Python机器学习之底层实现KNN
2021/06/20 Python