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 剪切移动文件的实现代码
Aug 02 Python
对python3新增的byte类型详解
Dec 04 Python
Python从数据库读取大量数据批量写入文件的方法
Dec 10 Python
Python实现的IP端口扫描工具类示例
Feb 15 Python
python仿evething的文件搜索器实例代码
May 13 Python
Kali Linux安装ipython2 和 ipython3的方法
Jul 11 Python
Python Selenium 之数据驱动测试的实现
Aug 01 Python
Python 实现一个手机号码获取妹子名字的功能
Sep 25 Python
使用OpenCV circle函数图像上画圆的示例代码
Dec 27 Python
从训练好的tensorflow模型中打印训练变量实例
Jan 20 Python
python 连续不等式语法糖实例
Apr 15 Python
利用python实现平稳时间序列的建模方式
Jun 03 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
在线增减.htpasswd内的用户
2006/10/09 PHP
php cout<<的一点看法
2010/01/24 PHP
PHP文件操作实现代码分享
2011/09/01 PHP
php等比例缩放图片及剪切图片代码分享
2016/02/13 PHP
Yii2 如何在modules中添加验证码的方法
2017/06/19 PHP
在laravel中使用Symfony的Crawler组件分析HTML
2017/06/19 PHP
PHP中ltrim()函数的用法与实例讲解
2019/03/28 PHP
40款非常棒的jQuery 插件和制作教程(系列一)
2011/10/26 Javascript
三种动态加载js的jquery实例代码另附去除js方法
2014/04/30 Javascript
javascript实现加载xml文件的方法
2015/11/24 Javascript
AngularJS Module方法详解
2015/12/08 Javascript
AngularJs IE Compatibility 兼容老版本IE
2016/09/01 Javascript
JavaScript中的ajax功能的概念和示例详解
2016/10/17 Javascript
微信小程序商城项目之商品属性分类(4)
2017/04/17 Javascript
详解angularJs模块ui-router之状态嵌套和视图嵌套
2017/04/28 Javascript
Vue 使用中的小技巧
2018/04/26 Javascript
json前后端数据交互相关代码
2018/09/19 Javascript
Vue.js 中 axios 跨域访问错误问题及解决方法
2018/11/21 Javascript
vue-cli或vue项目利用HBuilder打包成移动端app操作
2020/07/29 Javascript
Vue使用Element实现增删改查+打包的步骤
2020/11/25 Vue.js
python爬虫_微信公众号推送信息爬取的实例
2017/10/23 Python
利用pyinstaller将py文件打包为exe的方法
2018/05/14 Python
python 读写文件,按行修改文件的方法
2018/07/12 Python
详解django自定义中间件处理
2018/11/21 Python
python web自制框架之接受url传递过来的参数实例
2018/12/17 Python
在Python 中实现图片加框和加字的方法
2019/01/26 Python
django迁移文件migrations的实现
2020/03/31 Python
python3 配置logging日志类的操作
2020/04/08 Python
中国网上药店领导者:1药网
2017/02/16 全球购物
香港彩色隐形眼镜在线商店:Stunninglens(全球免费送货)
2019/05/10 全球购物
党员四风问题对照检查材料思想汇报
2014/09/16 职场文书
2015年机关后勤工作总结
2015/05/26 职场文书
家庭教育教师培训学习体会
2016/01/14 职场文书
Python中os模块的简单使用及重命名操作
2021/04/17 Python
zabbix agent2 监控oracle数据库的方法
2021/05/13 Oracle
Nginx如何获取自定义请求header头和URL参数详解
2022/07/23 Servers