Python办公19:图片水印添加——一键为数千张员工工牌或产品图加盖 Logo
19图片水印添加——一键为数千张员工工牌或产品图加盖 Logo第三阶段PDF 与图片处理16-22场景引入公司有 5000 张产品图片需要加上公司 Logo 水印或 2000 张员工工牌照片需要加盖仅限内部使用的文字水印。用 Photoshop 一张一张处理一个人都要干半天。本节教你用 Python 的 Pillow 库批量为图片添加文字水印或图片水印每秒处理几十张。技术原理使用 PillowPIL Fork库操作图片水印类型实现方式文字水印ImageDraw.text()图片水印LogoImage.paste()或Image.alpha_composite()半透明水印创建透明图层 Image.blend()倾斜水印Image.rotate()原图 → 创建透明图层 → 绘制水印 → 叠加到原图 → 保存环境准备pipinstallPillow完整代码fromPILimportImage,ImageDraw,ImageFont,ImageEnhanceimportosfrompathlibimportPath# 方案 1文字水印 defadd_text_watermark(input_image,output_image,text内部资料,positioncenter,font_size40,color(255,255,255,128),angle0): 为图片添加文字水印 参数: input_image: 输入图片路径 output_image: 输出图片路径 text: 水印文字 position: 位置 center/bottom-right/bottom-left/top-right/top-left font_size: 字体大小 color: 字体颜色 (R, G, B, A) angle: 旋转角度0水平-30左倾斜 # 打开图片imgImage.open(input_image).convert(RGBA)# 创建透明图层txt_layerImage.new(RGBA,img.size,(255,255,255,0))drawImageDraw.Draw(txt_layer)# 获取字体try:fontImageFont.truetype(C:/Windows/Fonts/msyh.ttc,font_size)# 微软雅黑except:fontImageFont.load_default()# 计算文字大小和位置bboxdraw.textbbox((0,0),text,fontfont)text_widthbbox[2]-bbox[0]text_heightbbox[3]-bbox[1]img_width,img_heightimg.size positions{center:((img_width-text_width)//2,(img_height-text_height)//2),bottom-right:(img_width-text_width-20,img_height-text_height-20),bottom-left:(20,img_height-text_height-20),top-right:(img_width-text_width-20,20),top-left:(20,20),}x,ypositions.get(position,positions[center])# 如果需要旋转ifangle!0:# 创建更大的图层以容纳旋转后的文字big_layerImage.new(RGBA,(img_width*2,img_height*2),(255,255,255,0))big_drawImageDraw.Draw(big_layer)big_draw.text((img_width//2,img_height//2),text,fontfont,fillcolor)big_layerbig_layer.rotate(angle,expand0)txt_layerbig_layer.crop((img_width//2,img_height//2,img_width//2img_width,img_height//2img_height))else:draw.text((x,y),text,fontfont,fillcolor)# 叠加resultImage.alpha_composite(img,txt_layer)# 保存转回 RGB 以便保存为 JPEGresultresult.convert(RGB)result.save(output_image,quality95)print(f文字水印:{os.path.basename(input_image)})# 方案 2图片水印Logo defadd_image_watermark(input_image,output_image,logo_path,positionbottom-right,opacity0.5,scale0.15): 为图片添加 Logo 水印 参数: input_image: 输入图片 output_image: 输出图片 logo_path: Logo 图片路径建议 PNG 透明背景 position: 位置 opacity: 透明度0-11完全不透明 scale: Logo 相对原图大小的比例0.1515% imgImage.open(input_image).convert(RGBA)# 打开 LogologoImage.open(logo_path).convert(RGBA)# 缩放 Logonew_logo_size(int(img.width*scale),int(img.height*scale*logo.height/logo.width))logologo.resize(new_logo_size,Image.LANCZOS)# 设置 Logo 透明度ifopacity1:# 调整 alpha 通道r,g,b,alogo.split()aa.point(lambdax:int(x*opacity))logoImage.merge(RGBA,(r,g,b,a))# 计算位置positions{center:((img.width-logo.width)//2,(img.height-logo.height)//2),bottom-right:(img.width-logo.width-20,img.height-logo.height-20),bottom-left:(20,img.height-logo.height-20),top-right:(img.width-logo.width-20,20),top-left:(20,20),}x,ypositions.get(position,positions[bottom-right])# 创建透明图层并粘贴 Logowatermark_layerImage.new(RGBA,img.size,(0,0,0,0))watermark_layer.paste(logo,(x,y))# 叠加resultImage.alpha_composite(img,watermark_layer)resultresult.convert(RGB)result.save(output_image,quality95)print(fLogo水印:{os.path.basename(input_image)})# 方案 3平铺水印全屏重复 defadd_tiled_watermark(input_image,output_image,text内部资料,font_size30,color(255,255,255,50),angle-30,spacing150): 添加平铺水印全屏重复文字 imgImage.open(input_image).convert(RGBA)txt_layerImage.new(RGBA,img.size,(255,255,255,0))drawImageDraw.Draw(txt_layer)try:fontImageFont.truetype(C:/Windows/Fonts/msyh.ttc,font_size)except:fontImageFont.load_default()# 计算文字大小bboxdraw.textbbox((0,0),text,fontfont)text_widthbbox[2]-bbox[0]text_heightbbox[3]-bbox[1]# 平铺y0whileyimg.height:x0row_offset(y//spacing)%2*(spacing//2)# 错行排列whileximg.width:draw.text((xrow_offset,y),text,fontfont,fillcolor)xtext_widthspacing ytext_heightspacing resultImage.alpha_composite(img,txt_layer)resultresult.convert(RGB)result.save(output_image,quality95)print(f平铺水印:{os.path.basename(input_image)})# 批量处理 defbatch_add_watermark(input_dir,output_dir,watermark_func,**kwargs): 批量为文件夹中的所有图片添加水印 input_pathPath(input_dir)output_pathPath(output_dir)output_path.mkdir(parentsTrue,exist_okTrue)image_extensions{.jpg,.jpeg,.png,.bmp,.webp,.tiff}count0forfile_pathininput_path.iterdir():iffile_path.is_file()andfile_path.suffix.lower()inimage_extensions:output_fileoutput_path/file_path.name watermark_func(str(file_path),str(output_file),**kwargs)count1print(f\n批量水印完成:{count}张图片)# 使用示例 if__name____main__:# 单个文件# add_text_watermark(工牌照片.jpg, 工牌_水印.jpg, text内部资料, positioncenter, font_size50)# 批量文字水印batch_add_watermark(input_dir原始工牌照片,output_dir已加水印,watermark_funcadd_text_watermark,text仅限内部使用,positioncenter,font_size40,)# 批量 Logo 水印# batch_add_watermark(# input_dir产品图片,# output_dir已加Logo,# watermark_funcadd_image_watermark,# logo_pathcompany_logo.png,# positionbottom-right,# opacity0.7,# scale0.1# )# 平铺水印防截图# batch_add_watermark(# input_dir机密文档截图,# output_dir平铺水印,# watermark_funcadd_tiled_watermark,# text机密文件,# font_size25,# angle-30,# )常见问题Q1中文水印显示为方框需要指定中文字体路径fontImageFont.truetype(C:/Windows/Fonts/msyh.ttc,font_size)# 微软雅黑# 或fontImageFont.truetype(C:/Windows/Fonts/simsun.ttc,font_size)# 宋体Q2水印太显眼覆盖了图片内容调整color的 alpha 值第四个参数color(255,255,255,50)# alpha50更透明Q3保存 PNG 后水印不见了确保保存时使用RGBA模式并指定 PNG 格式result.save(output_image,PNG)总结水印类型函数适用场景文字水印add_text_watermark()版权声明Logo 水印add_image_watermark()品牌标识平铺水印add_tiled_watermark()防泄漏标记本节掌握了为图片批量添加水印的能力。下一节预告20图片格式转换——Webp/PNG/JPG 批量互转及无损压缩

相关新闻

前端两年半跳槽实录:从简历优化到30+轮面试的完整复盘

前端两年半跳槽实录:从简历优化到30+轮面试的完整复盘

过完年回上海,我就开始陆续投简历。两年半经验,坐标魔都,前端方向,目标很明确:要么涨薪30%以上,要么换一个更有成长空间的平台。从二月中旬到三月下旬,前后投了二十多家,面试轮次加起…

2026/8/29 21:08:29 阅读更多 →
企业如何做好AI搜索获客?拓氪科技三层工程体系助力长效获客?

企业如何做好AI搜索获客?拓氪科技三层工程体系助力长效获客?

AI搜索获客绝非流于表面的营销噱头,而是一套架构完整、效果可量化、运营可持续的企业数字化增长工程体系。其核心逻辑简洁通透:先建立AI对品牌的完整认知与权威信任,再将AI端的官方认可,转化为企业长期稳定、精准高效的客户增长来…

2026/8/29 21:08:29 阅读更多 →
学生隐私日志数据集:探索学术环境中的学生参与度、语音学习和隐私风险

学生隐私日志数据集:探索学术环境中的学生参与度、语音学习和隐私风险

摘要:学生隐私日志数据集是一个面向学生参与度分析、英语语音学习与教育隐私风险研究的多模态教育数据集。 数据集概述 学生隐私日志数据集是一个面向学生参与度分析、英语语音学习与教育隐私风险研究的多模态教育数据集。数据集将学生语音、课堂/学习参与状态、英…

2026/8/29 21:07:28 阅读更多 →

最新新闻

搜狐畅游游戏开发实习生笔试真题详解与考点分析

搜狐畅游游戏开发实习生笔试真题详解与考点分析

2017年5月26号那场笔试,我到现在还记得。当时我在北京某高校的机房,屏幕上打开搜狐畅游的在线笔试系统,前面两页个人信息刚填完,第三页直接甩过来一套混合题——单选、多选、填空、简答、两道编程题,限时两个小时。同场…

2026/8/29 21:53:12 阅读更多 →
外观模式:简化复杂系统交互的架构设计模式详解

外观模式:简化复杂系统交互的架构设计模式详解

1. 外观模式:化繁为简的架构艺术在软件开发的日常里,我们常常会面对一个令人头疼的场景:一个复杂的子系统,内部由数十个类、接口和错综复杂的调用关系构成。比如,你要开发一个智能家居的控制中心,需要联动灯…

2026/8/29 21:53:12 阅读更多 →
数学建模竞赛全流程实战指南:从组队到论文写作的避坑策略

数学建模竞赛全流程实战指南:从组队到论文写作的避坑策略

1. 从零到一:我的建模竞赛初体验与核心认知第一次参加建模比赛,感觉就像被扔进了一个完全陌生的战场。手里只有一堆模糊的数据、一个抽象的题目,还有两个同样迷茫的队友。我记得当时我们三个人对着“城市共享单车调度优化”这个题目&#xff…

2026/8/29 21:53:12 阅读更多 →
模糊PID控制仿真:从原理到Simulink实现与调优

模糊PID控制仿真:从原理到Simulink实现与调优

1. 从经典到智能:为什么我们需要模糊PID控制?在自动化控制领域,PID控制器堪称“工业界的瑞士军刀”。无论是调节电机转速、稳定水箱液位,还是控制房间温度,其简洁的“比例-积分-微分”三环结构,让它在过去一…

2026/8/29 21:53:12 阅读更多 →
蓝桥杯Fibonacci数列:从递归超时到迭代取模的算法优化

蓝桥杯Fibonacci数列:从递归超时到迭代取模的算法优化

1. 项目概述:从“蓝桥入门训练”说起如果你刚开始接触编程竞赛,或者正在准备“蓝桥杯”这类算法竞赛,那么“入门训练”这个系列绝对是你绕不开的第一道坎。而“Fibonacci数列”这道题,几乎可以看作是所有竞赛入门者的“成人礼”。…

2026/8/29 21:53:12 阅读更多 →
自助图文打印系统:UI/PHP/教程三位一体解决方案

自助图文打印系统:UI/PHP/教程三位一体解决方案

简介:自助打印系统是面向图文快印场景的轻量级数字化基础设施,其核心在于解决用户端操作断点与后端文件处理可靠性之间的协同问题。原理上融合微信原生小程序UI交互规范、PHP驱动的ImageMagickGhostscript文件流水线、以及覆盖硬件校准与支付补单的工程化…

2026/8/29 21:52:11 阅读更多 →

日新闻

etc目录下的profile.d文件目录设置环境变量和全局脚本shell

etc目录下的profile.d文件目录设置环境变量和全局脚本shell

一、设置环境变量etc目录下的profile.d文件目录 /etc/profile.d1、编写 vi test.sh文件内容# jdk变量 export ZHK_HOME/root export PATH$PATH:$ZHK_HOME/test # 可以取出来ZHK_HOME变量给ZZZ_HOME赋值 export ZZZ_HOME${ZHK_HOME}/test2、刷新 执行source /etc/profile 命令使…

2026/8/29 0:00:24 阅读更多 →
【JavaScript】内存管理-垃圾回收机制-内存泄露

【JavaScript】内存管理-垃圾回收机制-内存泄露

内存管理 C 语言这样的底层语言一般都有底层的内存管理接口,比如 malloc()和free()。 而 JavaScript 是在创建变量(对象,字符串等)时自动进行了分配内存,并且在不使用它们时“自动”释放。释放的过程称为垃圾回收。 整…

2026/8/29 0:00:24 阅读更多 →
Labgrid-MCP:为嵌入式硬件实验室接入AI Agent操控能力

Labgrid-MCP:为嵌入式硬件实验室接入AI Agent操控能力

Labgrid-MCP 的目标是把 MCP(Model Context Protocol)能力延伸到真实嵌入式硬件实验室:AI Agent 通过一个标准化的 MCP Server,就能查看目标板状态、控制上电断电、复位开发板、读取串口日志,甚至执行镜像刷写。对于经…

2026/8/29 0:00:24 阅读更多 →

周新闻

[光学原理与应用-521]:对光的错误理解与纠偏

[光学原理与应用-521]:对光的错误理解与纠偏

首先光是一种能量的载体和形态,宏观上观察到的光是由无数个微观的光量子组成的,每个光子在产生的瞬间,其在真空的空间中以确定不变的速度沿着一个初始的方向一直向前,在微观层面,每个光量子的运动轨迹是以波函数所展现…

2026/8/29 18:08:35 阅读更多 →
SIP通话转接原理与REFER方法实战解析

SIP通话转接原理与REFER方法实战解析

1. 通话转接不是“挂断再拨号”,而是SIP会话的动态重定向你有没有遇到过这样的场景:客服坐席A正在和客户通电话,突然需要把这通对话无缝转给专家坐席B,客户完全感知不到中间的断连——既没听到忙音,也没被要求重新拨号…

2026/8/28 23:05:07 阅读更多 →
Kolla-ansible单节点OpenStack部署实战:从环境准备到排坑指南

Kolla-ansible单节点OpenStack部署实战:从环境准备到排坑指南

1. 为什么选择Kolla-ansible来部署单节点OpenStack?如果你正在寻找一种能把OpenStack从“概念”快速变成“可用的实验环境”的方法,那么Kolla-ansible几乎是当前最主流、最省心的选择。我见过太多人卡在手动编译依赖、配置服务、处理版本冲突的泥潭里&am…

2026/8/28 19:47:53 阅读更多 →

月新闻

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南 【免费下载链接】BaiduNetdiskPlugin-macOS For macOS.百度网盘 破解SVIP、下载速度限制~ 项目地址: https://gitcode.com/gh_mirrors/ba/BaiduNetdiskPlugin-macOS 还在为百度网盘macOS版的龟速下…

2026/8/29 4:34:53 阅读更多 →
终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换

终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换

终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换 【免费下载链接】ncmdump 项目地址: https://gitcode.com/gh_mirrors/ncmd/ncmdump 还在为网易云音乐下载的NCM格式文件无法在其他播放器播放而烦恼吗?ncmdump解密工具帮你轻松解决这个困…

2026/8/28 17:43:04 阅读更多 →
HarmonyOS 应用开发《掌上英语》第81篇: 智能体卡片:为英语学习 App 打造桌面级学习助手

HarmonyOS 应用开发《掌上英语》第81篇: 智能体卡片:为英语学习 App 打造桌面级学习助手

AgentCard 智能体卡片:为英语学习 App 打造桌面级学习助手适用平台:HarmonyOS 7.0 (API 26 Beta)一、引言 HarmonyOS 7.0(API 26 Beta)新增了 AgentCard 智能体卡片能力,这是继 HMAF(鸿蒙智能体框架&#x…

2026/8/29 2:05:18 阅读更多 →