使用pillow库为图片添加文件或者图片水印

下面是我们想要添加水印的图片:

图片水印:

效果图如下:

ps:对图片添加字体时,需指定字体文件,如 simsun.ttc

windows中在 C:\Windows\Fonts 路径下

linux中在 /usr/share/fonts 路径下,若不存在时需先去下载,linux中字体文件默认没有中文字体(最简单的方法,大家可以将windows中的字体文件复制到linux上的字体文件路径下)。

代码如下:

from PIL import Image, ImageFont, ImageDraw
import os


def image_add_watermark(image_path="", logo_path=""):
# 读取上传的图片
# image_file = request.files
# image_name = image_file.filename
# image = Image.open(io.BytesIO(image_file.read()))
image = Image.open(image_path)
image_name = 'xx.png'
# 降低像素
image = image.convert('RGBA').resize((image.width, image.height), Image.ANTIALIAS)
# 可以指定图片的保存路径
image_path = os.path.join('image_file', image_name)
image.save(image_path)

# 添加文字水印
add_watermark(image_path, '长情不羁的五年', 'simsun.ttc', font_size=150)
# 添加图片水印
# add_watermark_logo(image_path, logo_path)
print('执行完成》》》》》》》》》》》》')


def add_watermark(image_path, text, font_path, font_size=40, fill=(255, 255, 255, 128)):
"""
在图片上添加水印
:param image_path: 图片路径
:param text: 水印文本
:param font_path: 字体文件路径
:param font_size: 字体大小,默认为 40
:param fill: 水印颜色,默认为白色半透明
:return: None
"""
with Image.open(image_path) as image:
draw = ImageDraw.Draw(image)
width, height = image.size
font = ImageFont.truetype(font_path, font_size)
text_width, text_height = draw.textsize(text, font=font)
x = int((width - text_width) / 2)
y = int((height - text_height) / 2)
draw.text((x, y), text, font=font, fill=fill)
image.save(image_path)


def add_watermark_logo(image_path, logo_path):
"""
在图片上添加水印
:param image_path: 图片路径
:param logo_path: 水印路径
:return: None
"""
with Image.open(image_path) as image:
watermark = Image.open(logo_path).convert("RGBA").resize((image.width // 2, image.height // 3)) # 指定图片的大小
image.paste(watermark, (0, 0), watermark) # 添加的水印相对于图片的位置(x, y), 基于图片左上角
image.show()
image.save(image_path)


image_add_watermark('mm.jpg', 'logo.png')
 

使用PIL为图片添加水印的更多相关文章

  1. 【Python】给图片添加水印的Python及Golang实现

    前言 不知道大家有没有这样的习惯,一篇比较得意的博客在发表一段时间之后会特别关注,前段时间一篇写到凌晨的博客被 码迷 这个网关爬取之后发表了,因为搜索引擎先爬取码迷的,所以我的博客无法被搜索到,即使直 ...

  2. Python Windows 快捷键自动给剪贴板(复制)图片添加水印

    编写一个能在windows上使用的按下快捷键自动给剪贴板(复制)的图片添加水印的小工具.plyer.PIL.pyinstaller.pynput.win32clipboard库.记录自己踩过的坑,部分 ...

  3. Android 图片添加水印图片或者文字

    给图片添加水印的基本思路都是载入原图,添加文字或者载入水印图片,保存图片这三个部分 添加水印图片: ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 ...

  4. java实现给图片添加水印

    package michael.io.image; import java.awt.AlphaComposite; import java.awt.Graphics2D; import java.aw ...

  5. java.imageIo给图片添加水印

    最近项目在做一个商城项目, 项目上的图片要添加水印①,添加图片水印;②:添加文字水印; 一下提供下个方法,希望大家可以用得着: package com.blogs.image; import java ...

  6. ASP.NET -- WebForm -- 给图片添加水印标记

    ASP.NET -- WebForm: 给图片添加水印标记 ASP.NET:使用 WebForm(C#) 制作一个简单的为图片添加水印的页面. 1. Test2.aspx文件 <%@ Page ...

  7. python base64 编解码,转换成Opencv,PIL.Image图片格式

    二进制打开图片文件,base64编解码,转成Opencv格式: # coding: utf-8 import base64 import numpy as np import cv2 img_file ...

  8. JAVA给图片添加水印

    package com.test; import org.junit.Test; import javax.imageio.ImageIO; import java.awt.*; import jav ...

  9. .net为图片添加水印(转) jpg png和gif格式

    .net为图片添加水印(转) jpg png和gif格式 .net为图片添加水印(转) jpg png和gif格式,转自csdn的hyde82,现在跟大家一起来分享下: 利 用.net中System. ...

  10. iOS边练边学--(Quartz2D)图片添加水印

    一.给图片添加水印的基本步骤 加载图片 手动创建位图上下文 绘制原生的图片 给原生的图片添加文字 生成一张图片给我们,从上下文中获取图片 关闭上下文 二.注意:位图上下文的获取方式跟layer上下文不 ...

随机推荐

  1. Node.js出现‘Cannot find module init’ 解决方法

    1. 首先查看当前根目录是否有node_module文件夹,如果有,请删除 2. 输入 npm clean cache 3. 再次输入 node init -y 大功告成

  2. Pyhton F字符串引起的invalid syntax

    事发现场 偶然运行到之前写的爬虫,发现运行不了,报错invalid syntax,于是来找bug 报错截图: 原因: 这样用法称之为 f-string f-string,亦称为格式化字符串常量(for ...

  3. 聊聊ElasticeSearch并发写的乐观锁机制

    概述 ES的多客户端并发更新是基于乐观并发控制,通过版本号机制来实现冲突检测. 关键对象 ES的老版本是用过_version字段的版本号实现乐观锁的.现在新版增加了基于_seq_no与_primary ...

  4. 代码随想录算法训练营Day20 二叉树| 235. 二叉搜索树的最近公共祖先 701.二叉搜索树中的插入操作 450.删除二叉搜索树中的节点

    代码随想录算法训练营 235. 二叉搜索树的最近公共祖先 题目链接:235. 二叉搜索树的最近公共祖先 给定一个二叉搜索树, 找到该树中两个指定节点的最近公共祖先. 百度百科中最近公共祖先的定义为:& ...

  5. Python异步编程之web框架 异步vs同步 文件IO任务压测对比

    测试基本信息 主题:比较异步框架和同步框架在文件IO操作的性能差异 python版本:python 3.8 压测工具:locust web框架:同步:flask 异步:aiohttp.starlett ...

  6. 使用 Docker 分析高通量测序数据

    端午节假期,先祝各位 Bio IT 的爱好者们,节日快乐! 做生信的童鞋想要学习 Docker,或者使用 Docker+Pipeline 封装自己的一套数据分析流程,相信一定不能错过胡博强老师在201 ...

  7. Linux服务器设置虚拟内存

    cd /usrsudo mkdir swapcd swapsudo dd if=/dev/zero of=/usr/swap/swapfile bs=1M count=4096du -sh /usr/ ...

  8. c++中vector容器的用法

    C语言中const关键字是constant的缩写,通常翻译为常量.常数等,它可以修饰变量.数组.指针.函数参数. vector 是向量类型,它可以容纳许多类型的数据,如若干个整数,所以称其为容器.ve ...

  9. Helm实战案例一:在Kubernetes上使用Helm搭建Prometheus Operator监控

    目录 一.系统环境 二.前言 三.Prometheus Operator简介 四.helm安装prometheus-operator 五.配置prometheus-operator 5.1 修改gra ...

  10. @Repeatable元注解的使用

    @Repeatable注解表明标记的注解可以多次应用于相同的声明或类型,此注解由Java SE 8版本引入.以下示例如何使用此注解: 第一步,先声明一个重复注解类: package org.sprin ...