当前位置: 首页 > news >正文

python给图片加上图片水印

python给图片加上图片水印

  • 作用
  • 效果
  • 代码

作用

  1. 给图片加上图片水印
  2. 图片水印的透明度,位置可自定义

效果

原始图片:
在这里插入图片描述

水印图片:
在这里插入图片描述

添加水印后的图片:
在这里插入图片描述

代码

from PIL import Image, ImageDraw, ImageFontdef add_watermark(input_image_path, watermark_image_path, output_image_path, position=(0.5, 0.5), opacity=0.5):"""在图片上添加水印:param input_image_path: 输入图片路径:param watermark_image_path: 水印图片路径:param output_image_path: 输出图片路径:param position: 水印位置,默认为图片中心 (x, y) 坐标值在0到1之间:param opacity: 水印的不透明度,1为完全不透明,0为完全透明:return: None"""base_image = Image.open(input_image_path).convert("RGBA")watermark = Image.open(watermark_image_path).convert("RGBA")# 获取图片尺寸base_width, base_height = base_image.sizewatermark_width, watermark_height = watermark.size# 计算水印位置left = int(base_width * position[0] - watermark_width / 2)top = int(base_height * position[1] - watermark_height / 2)# 限制水印位置在图片内left = max(0, left)top = max(0, top)right = min(base_width, left + watermark_width)bottom = min(base_height, top + watermark_height)# 调整水印图片大小以适应新的位置,并使用抗锯齿滤波器watermark = watermark.resize((right - left, bottom - top), Image.LANCZOS)# 在水印图片上应用透明度# 注意:这里我们假设水印图片已经有了一个alpha通道,否则需要另外处理# 我们通过创建一个新的RGBA图片,并用水印图片和其alpha值来填充它,然后调整alpha值来改变不透明度watermark_rgba = Image.new('RGBA', watermark.size, (255, 255, 255, int(255 * opacity)))watermark_rgba.alpha_composite(watermark)# 将水印添加到原始图片上base_image.paste(watermark_rgba, (left, top), watermark_rgba)# 保存图片base_image.save(output_image_path)# 使用示例
add_watermark('1.png', 'te.png', 'output_with_watermark.png')

相关文章:

  • 第二证券今日投资参考:5月国产游戏版号发放 猪价加速上涨
  • 农林乙级资质换证新动态:行业趋势与机遇
  • 【C++刷题】优选算法——递归第三辑
  • Python高克勒-曼宁-斯特里克勒公式计算一维流量
  • JAVA面试题大全(二)
  • Java基础入门day52
  • 网络协议——Modbus-RTU
  • angr使用学习
  • 基于Python flask的豆瓣电影数据分析可视化系统,功能多,LSTM算法+注意力机制实现情感分析,准确率高达85%
  • Flutter 中的 ExpandIcon 小部件:全面指南
  • 2024电工杯数学建模 - 案例:最短时间生产计划安排
  • 线性回归分析
  • 第四十二天 | 背包问题理论
  • 无线通信的穿墙能力主要取决于哪些指标
  • vscode打造舒适的python开发环境
  • - C#编程大幅提高OUTLOOK的邮件搜索能力!
  • Java IO学习笔记一
  • js数组之filter
  • React Transition Group -- Transition 组件
  • Twitter赢在开放,三年创造奇迹
  • TypeScript实现数据结构(一)栈,队列,链表
  • ⭐ Unity 开发bug —— 打包后shader失效或者bug (我这里用Shader做两张图片的合并发现了问题)
  • Vue.js源码(2):初探List Rendering
  • yii2中session跨域名的问题
  • 百度贴吧爬虫node+vue baidu_tieba_crawler
  • 从零开始学习部署
  • 从伪并行的 Python 多线程说起
  • 名企6年Java程序员的工作总结,写给在迷茫中的你!
  • 排序算法之--选择排序
  • 前端工程化(Gulp、Webpack)-webpack
  • 如何设计一个比特币钱包服务
  • 算法-插入排序
  • 吐槽Javascript系列二:数组中的splice和slice方法
  • 微信小程序上拉加载:onReachBottom详解+设置触发距离
  • 要让cordova项目适配iphoneX + ios11.4,总共要几步?三步
  • 用quicker-worker.js轻松跑一个大数据遍历
  • ​决定德拉瓦州地区版图的关键历史事件
  • ###C语言程序设计-----C语言学习(6)#
  • #我与Java虚拟机的故事#连载03:面试过的百度,滴滴,快手都问了这些问题
  • (2024,Vision-LSTM,ViL,xLSTM,ViT,ViM,双向扫描)xLSTM 作为通用视觉骨干
  • (3)Dubbo启动时qos-server can not bind localhost22222错误解决
  • (42)STM32——LCD显示屏实验笔记
  • (MATLAB)第五章-矩阵运算
  • (poj1.3.2)1791(构造法模拟)
  • (react踩过的坑)Antd Select(设置了labelInValue)在FormItem中initialValue的问题
  • (带教程)商业版SEO关键词按天计费系统:关键词排名优化、代理服务、手机自适应及搭建教程
  • (附源码)springboot教学评价 毕业设计 641310
  • (附源码)ssm基于微信小程序的疫苗管理系统 毕业设计 092354
  • (三)SvelteKit教程:layout 文件
  • (淘宝无限适配)手机端rem布局详解(转载非原创)
  • (五) 一起学 Unix 环境高级编程 (APUE) 之 进程环境
  • (轉)JSON.stringify 语法实例讲解
  • .gitignore文件---让git自动忽略指定文件
  • .NET Core 实现 Redis 批量查询指定格式的Key
  • .NET Framework Client Profile - a Subset of the .NET Framework Redistribution