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 07 Python
跟老齐学Python之传说中的函数编写条规
Oct 11 Python
Python获取DLL和EXE文件版本号的方法
Mar 10 Python
python结合shell查询google关键词排名的实现代码
Feb 27 Python
Windows下python2.7.8安装图文教程
May 26 Python
浅谈scrapy 的基本命令介绍
Jun 13 Python
Python提取支付宝和微信支付二维码的示例代码
Feb 15 Python
python实现合并两个排序的链表
Mar 03 Python
浅谈Django中view对数据库的调用方法
Jul 18 Python
Flask 上传自定义头像的实例详解
Jan 09 Python
python 利用jieba.analyse进行 关键词提取
Dec 17 Python
利用Python判断整数是否是回文数的3种方法总结
Jul 07 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 5.3 下载时 VC9、VC6、Thread Safe、Non Thread Safe的区别分析
2011/03/28 PHP
php以post形式发送xml的方法
2014/11/04 PHP
php使用lua+redis实现限流,计数器模式,令牌桶模式
2019/04/04 PHP
图片动画横条广告带上下滚动可自定义图片、链接等等
2013/10/20 Javascript
js编写trim()函数及正则表达式的运用
2013/10/24 Javascript
jQuery 回车事件enter使用示例
2014/02/18 Javascript
JS在IE下缺少标识符的错误
2014/07/23 Javascript
javascript手风琴下拉菜单实现代码
2015/11/12 Javascript
微信小程序 二维码canvas绘制实例详解
2017/01/06 Javascript
微信小程序中使用ECharts 异步加载数据实现图表功能
2018/07/13 Javascript
一步快速解决微信小程序中textarea层级太高遮挡其他组件
2019/03/04 Javascript
Vue中computed、methods与watch的区别总结
2019/04/10 Javascript
微信小程序实现多选框全选与取消全选功能示例
2019/05/14 Javascript
微信小程序+腾讯地图开发实现路径规划绘制
2019/05/22 Javascript
laravel-admin 与 vue 结合使用实例代码详解
2019/06/04 Javascript
Nuxt.js nuxt-link与router-link的区别说明
2020/11/06 Javascript
[00:12]2018DOTA2亚洲邀请赛 Sccc亮相SOLO赛,今年他又会有什么样的战绩?
2018/04/06 DOTA
[00:18]天涯墨客三技能展示
2018/08/25 DOTA
Python中的with语句与上下文管理器学习总结
2016/06/28 Python
浅谈django中的认证与登录
2016/10/31 Python
详解Python中where()函数的用法
2018/03/27 Python
python实现引用其他路径包里面的模块
2020/03/09 Python
Pycharm中安装wordcloud等库失败问题及终端通过pip安装的Python库如何添加到Pycharm解释器中(推荐)
2020/05/10 Python
Python实现PS滤镜中的USM锐化效果
2020/12/04 Python
python 实现百度网盘非会员上传超过500个文件的方法
2021/01/07 Python
HTML5之SVG 2D入门11—用户交互性(动画)介绍及应用
2013/01/30 HTML / CSS
HTML5 播放 RTSP 视频的实例代码
2019/07/29 HTML / CSS
印度手工编织服装和家居用品商店:Fabindi
2019/10/07 全球购物
文化宣传方案
2014/03/13 职场文书
艺人经纪人岗位职责
2014/04/15 职场文书
2015年信息宣传工作总结
2015/05/26 职场文书
golang 实现时间戳和时间的转化
2021/05/07 Golang
Nginx反向代理配置的全过程记录
2021/06/22 Servers
Java实现多线程聊天室
2021/06/26 Java/Android
奥特曼十大神器:奥特手镯在榜,第一是贝利亚的神器
2022/03/18 日漫
Windows Server 2016服务器用户管理及远程授权图文教程
2022/08/14 Servers