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入门篇之列表和元组
Oct 17 Python
详解如何用OpenCV + Python 实现人脸识别
Oct 20 Python
Python随机函数random()使用方法小结
Apr 29 Python
django框架forms组件用法实例详解
Dec 10 Python
Python enumerate函数遍历数据对象组合过程解析
Dec 11 Python
Python 列表的清空方式
Jan 13 Python
Python tkinter模版代码实例
Feb 05 Python
pymysql 插入数据 转义处理方式
Mar 02 Python
python GUI库图形界面开发之PyQt5布局控件QVBoxLayout详细使用方法与实例
Mar 06 Python
Python模块相关知识点小结
Mar 09 Python
Python引入多个模块及包的概念过程解析
Sep 21 Python
Python实现我的世界小游戏源代码
Mar 02 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
详细介绍:Apache+PHP+MySQL配置攻略
2006/09/05 PHP
基于php无限分类的深入理解
2013/06/02 PHP
php 下载保存文件保存到本地的两种实现方法
2013/08/12 PHP
PHP判断是否有Get参数的方法
2014/05/05 PHP
js+php实现静态页面实时调用用户登陆状态的方法
2015/01/04 PHP
PHP 图片合成、仿微信群头像的方法示例
2019/10/25 PHP
用JavaScript 处理 URL 的两个函数代码
2007/08/13 Javascript
浏览器无法运行JAVA脚本的解决方法
2008/01/09 Javascript
JavaScript面向对象之静态与非静态类
2010/02/03 Javascript
javascript中的new使用
2010/03/20 Javascript
js选取多个或单个元素的实现代码(用class)
2012/08/22 Javascript
Javascript中valueOf与toString区别浅析
2013/03/19 Javascript
你必须知道的Javascript知识点之"this指针"的应用
2013/04/23 Javascript
jquery获取元素值的方法(常见的表单元素)
2013/11/15 Javascript
jQuery 滑动方法slideDown向下滑动元素
2014/01/16 Javascript
js单独获取一个checkbox看其是否被选中
2014/09/22 Javascript
jQuery插件pagination实现分页特效
2015/04/12 Javascript
jquery判断单选按钮radio是否选中的方法
2015/05/05 Javascript
jQuery easyui的validatebox校验规则扩展及easyui校验框validatebox用法
2016/01/18 Javascript
jQuery 特性操作详解及实例代码
2016/09/29 Javascript
jQuery实现上传图片前预览效果功能
2017/08/03 jQuery
vue实现在一个方法执行完后执行另一个方法的示例
2018/08/25 Javascript
详解js根据百度地图提供经纬度计算两点距离
2019/05/13 Javascript
vue spa应用中的路由缓存问题与解决方案
2019/05/31 Javascript
python模拟鼠标拖动操作的方法
2015/03/11 Python
python实现学生管理系统
2018/01/11 Python
python爬虫获取淘宝天猫商品详细参数
2020/06/23 Python
python3实现磁盘空间监控
2018/06/21 Python
python实现移位加密和解密
2019/03/22 Python
HTML5中div、article、section的区别及使用介绍
2013/08/14 HTML / CSS
HTML5 canvas基本绘图之图形变换
2016/06/27 HTML / CSS
秋季校运动会广播稿
2014/02/23 职场文书
篮球比赛口号
2014/06/10 职场文书
2014国庆节标语口号
2014/09/19 职场文书
Pygame Draw绘图函数的具体使用
2021/11/17 Python
Python日志模块logging用法
2022/06/05 Python