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 相关文章推荐
Pycharm学习教程(6) Pycharm作为Vim编辑器使用
May 03 Python
python里使用正则表达式的组嵌套实例详解
Oct 24 Python
一些Centos Python 生产环境的部署命令(推荐)
May 07 Python
python3学习之Splash的安装与实例教程
Jul 09 Python
对python PLT中的image和skimage处理图片方法详解
Jan 10 Python
对Python生成汉字字库文字,以及转换为文字图片的实例详解
Jan 29 Python
django celery redis使用具体实践
Apr 08 Python
Falsk 与 Django 过滤器的使用与区别详解
Jun 04 Python
python 数据生成excel导出(xlwt,wlsxwrite)代码实例
Aug 23 Python
Python requests设置代理的方法步骤
Feb 23 Python
基于Python模拟浏览器发送http请求
Nov 06 Python
Python基础详解之邮件处理
Apr 28 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
一个分页的论坛
2006/10/09 PHP
PHP版自动生成文章摘要
2008/07/23 PHP
php调用dll的实例操作动画与代码分享
2012/08/14 PHP
ThinkPHP的cookie和session冲突造成Cookie不能使用的解决方法
2014/07/01 PHP
php获取客户端电脑屏幕参数的方法
2015/01/09 PHP
php输出全球各个时区列表的方法
2015/03/31 PHP
laravel7学习之无限级分类的最新实现方法
2020/09/30 PHP
javascript网页关闭时提醒效果脚本
2008/10/22 Javascript
Javascript 获取LI里的内容
2008/12/17 Javascript
ExtJS4 Grid改变单元格背景颜色及Column render学习
2013/02/06 Javascript
详解addEventListener的三个参数之useCapture
2015/03/16 Javascript
Windows系统下Node.js的简单入门教程
2015/06/23 Javascript
node.js中格式化数字增加千位符的几种方法
2015/07/03 Javascript
node的process以及child_process模块学习笔记
2018/03/06 Javascript
微信小程序实现星级评价
2019/11/20 Javascript
微信小程序wxml列表渲染原理解析
2019/11/27 Javascript
详细分析vue响应式原理
2020/06/22 Javascript
Python生成pdf文件的方法
2014/08/04 Python
Python的装饰器模式与面向切面编程详解
2015/06/21 Python
python微信跳一跳系列之棋子定位像素遍历
2018/02/26 Python
Python Xml文件添加字节属性的方法
2018/03/31 Python
django 将model转换为字典的方法示例
2018/10/16 Python
Python使用pandas和xlsxwriter读写xlsx文件的方法示例
2019/04/09 Python
PyQt5 实现字体大小自适应分辨率的方法
2019/06/18 Python
pytorch在fintune时将sequential中的层输出方法,以vgg为例
2019/08/20 Python
Python3的unicode编码转换成中文的问题及解决方案
2019/12/10 Python
css3 flex布局 justify-content:space-between 最后一行左对齐
2020/01/02 HTML / CSS
查环查孕证明
2014/01/10 职场文书
毕业生如何写自荐信
2014/03/26 职场文书
租赁意向书范本
2014/04/01 职场文书
合作协议书范本
2014/04/17 职场文书
共产党员岗位承诺书
2014/05/29 职场文书
旅游文化节策划方案
2014/06/06 职场文书
早恋主题班会
2015/08/14 职场文书
JavaScript中document.activeELement焦点元素介绍
2021/11/27 Javascript
git中cherry-pick命令的使用教程
2022/06/25 Servers