文章的时候可以设置是否添加水印。可是,有些图片可能想加水印,有些不想加水印,该怎么办呢?

配置环境

python3 + pillow

pip3 install pillow

引入库

from PIL import Image, ImageSequence
import os
import random

效果预览:

使用方法:

  1. 在脚本同目录下添加水印图片 logo.png
  2. 创建目录 input 并在放入要添加水印的图片
  3. 创建目录 output 执行脚本 addlogo.py
  4. 结果输出在 output 文件夹下

实现原理

水印图片采集:

先读取水印图片的像素点信息和大小信息。去除透明度为0的像素,并修改透明度像素信息。


在学习过程中有什么不懂得可以加我的
python学习扣扣qun,784758214
群里有不错的学习视频教程、开发工具与电子书籍。
与你分享python企业当下人才需求及怎么从零基础学习好python,和学习什么内容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.0a=a1+a2c=(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.sizeoffX = 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学习资源扣QUN:⑦⑧④⑦⑤⑧②①④ 从零基础开始到Python各领域的项目实战教程、开发工具与电子书籍。与你分享企业当下对于python人才需求及学好python的高效技巧,不停更新最新教程!点击加入我们的 python学习圈


本文仅供个人学习交流使用,请勿用于其他用途!

python 实现图片批量加入水印!相关推荐

  1. python图片批量处理器_用python给图片批量打水印

    之前写菲律宾游记,想给自己的照片批量打上水印,首先想到的就是用Python实现给图片加文字,然后写个循环. 做过图像识别的,应该知道OpenCV,其中cv2.putText()函数,就可以实现在图片 ...

  2. python批量添加水印_python 给目录下的图片批量加水印

    python 给目录下的图片批量加水印 water.py 放到 图片文件夹里 然后cd 到当前文件夹 python water.py #coding=utf-8 import Image import ...

  3. Python 给图片批量加logo+logo透明化

    利用Python 给图片批量加logo+logo透明化 通过图片上新建图层 把logo水印图片添加到图层 并合并 from PIL import ImageDraw from PIL import I ...

  4. Linux打印添加水印,Linux 下给图片批量加水印

    一个非盈利组织的项目负责人突发奇想想给他们网站上的每张照片加上水印,说实话那些照片都是平时活动.party 的生活照片用不着用水印那么夸张,第一次听说给生活照加水印的.没办法,谁让我们和他们有合作项目 ...

  5. 【Python+图片切割+图片合并】基于Python的图片批量切割与合并(保持原像素不变,不会出现像素大小不匹配、填充黑边的问题)

    基于Python的图片批量切割与合并(保持原像素不变,不会出现像素大小不匹配.填充黑边的问题) 前言 效果图 1.批量读取文件 2.清空目标目录方法(配合切割图片方法使用) 3.批量切割图片(像素不足 ...

  6. linux内存水印,Linux图片批量加水印

    在 Linux 下给图片批量加水印很简单,以imagemagick为基础,使用一个Shell命令即可搞定. 批量处理图片需要ImageMagick,ImageMagick的功能 1. 将图片从一个格式 ...

  7. php 图片批量加水印

    本文实例讲述了PHP图片加水印实现方法.分享给大家供大家参考,代码不是很完善,欢迎大家多多指教!代码如下: <!DOCTYPE html PUBLIC "-//W3C//DTD XHT ...

  8. 如何给图片批量加水印?

    如何给图片批量加水印?如果你是开网店的,或者你是一名自媒体创作者,为了防止自己的图片不被别人盗用,每天肯定需要给大量的图片添加水印,如果图片数量较多,那么工作量就肯定非常的大,每天肯定要花费大量的时间 ...

  9. Python应用之批量打水印

    之前写菲律宾游记,想给自己的照片批量打上水印,首先想到的就是用Python实现给图片加文字,然后写个循环. 做过图像识别的,应该知道OpenCV,其中cv2.putText()函数,就可以实现在图片上 ...

最新文章

  1. Java调用python打包的程序.exe,包括获取exec()中打印的日志,亲测有效
  2. SQL 性能起飞了!
  3. MySQL里 unique 用法_mysql中unique key中在查询中的使用
  4. oracle手工收集awr报告_WHAT——什么是AWR?
  5. dubbo web工程示例_带有Dubbo的Spring Cloud Alibaba
  6. SQL Cookbook—数字、日期
  7. 相见恨晚!遗憾仅有不到1% 的人知道
  8. 聊聊 Python 调用 JS 的几种方式,你都知道吗?
  9. visual studio 设计器不显示_设计模式 | Iterator设计模式
  10. 计算机会计系统审计的内容包括什么,会计电算化系统审计.docx
  11. android获取详细地址,Android获取当前子网掩码地址(亲测可用)
  12. 快速用 Haskell 构建超级简单的 Web 技术栈!
  13. SpringBoot整合Dubbo案例
  14. Android日常开发总结的技术经验60条 转
  15. 通用即插即用监视器驱动下载_DirectX10下载|DirectX10 10.1 官方版
  16. Java中this关键字详解
  17. Ubuntu下 UltraEdit 破解/显色
  18. Android11.0(R) MTK user版本打开MtkLog功能
  19. (3种解决思路)OSError: [Errno 22] Invalid argument:解决python爬虫中报错
  20. 非零基础自学Golang 第15章 Go命令行工具 15.4 注释文档(doc)

热门文章

  1. 伤感qq日志-爱冷了 情淡了、心累了,陌生了
  2. 菜谱 延安特色美食小吃
  3. 九九乘法表(99)详解
  4. [软件工程 复习] 记录
  5. 【蓝桥杯】特别数的和
  6. Springboot返回数据形式
  7. Base64在线转换工具(详解)
  8. 中联医疗系统服务器,中联医学影像系统(PACS)
  9. 在线支付系列【2】支付宝和微信支付发展史
  10. 小程序图片电脑开发显示,手机上不显示的问题