【Python】PIL给图片添加水印最全代码解释

这篇具有很好参考价值的文章主要介绍了【Python】PIL给图片添加水印最全代码解释。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

给图片添加水印

以下是一个添加水印的方法,你可以将其放在一个单独的 Python 文件中,然后在需要添加水印的地方调用该方法即可:

from PIL import Image, ImageDraw, ImageFont


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)

该方法接受五个参数:

  • image_path:需要添加水印的图片路径;
  • text:水印文本;
  • font_path:字体文件路径;
  • font_size:字体大小,默认为 40;
  • fill:水印颜色,默认为白色半透明。

你可以根据需要修改这些参数。

使用该方法的示例代码如下:

add_watermark('image.jpg', 'Hello, world!', 'simsun.ttc', font_size=50)

该代码会在 image.jpg 图片中添加一个水印,水印文本为 Hello, world!,字体为 simsun.ttc,字体大小为 50。

fill参数解释:

fill 参数指定了水印的颜色。在 PIL 库中,颜色是以一个四元组来表示的,四元组中的四个值分别代表红、绿、蓝和透明度,取值范围为 0 到 255。例如,(255, 0, 0, 128) 表示红色半透明。

add_watermark() 方法中,我们将默认的 fill 参数设置为 (255, 255, 255, 128),即白色半透明,这样可以让水印不会完全遮挡住原图。你可以根据需要修改该参数,例如将水印颜色修改为红色,可以将 fill 参数修改为 (255, 0, 0, 128)

textbbox参数解释

textbbox() 方法是 Pillow 库中 ImageDraw 模块提供的一个函数,用于计算绘制文本所需的矩形框的大小。该方法的语法如下:

ImageDraw.Draw.textbbox(xy, text, font=None, spacing=0, align='left')

其中,各参数的含义如下:

  • xy:一个二元组 (x, y),表示文本的起始位置,即文本框的左上角坐标。
  • text:表示要绘制的文本内容。
  • font:表示字体对象,可以使用 ImageFont.truetype() 方法创建。
  • spacing:表示行与行之间的间距,默认为 0。
  • align:表示文本的水平对齐方式,可以是 'left''center''right'

textbbox() 方法会根据文本内容、字体和起始位置等信息计算出文本框的大小,返回一个四元组 (x0, y0, x1, y1),表示文本框的左上角和右下角坐标。其中,(x0, y0) 表示文本框的左上角坐标,(x1, y1) 表示文本框的右下角坐标。

在绘制文本时,我们可以使用 textbbox() 方法先计算出文本框的大小,然后根据文本框的大小来计算文本的位置,从而确保文本在图片中居中或居左等对齐方式。

异常处理
warning提示:

DeprecationWarning: textsize is deprecated and will be removed in Pillow 10 (2023-07-01). Use textbbox or textlength instead. text_width, text_height = draw.textsize(text, font=font)

解决方法:

这个警告是因为在 Pillow 库的未来版本中,textsize() 方法将被弃用,建议使用 textbbox()textlength() 方法代替。因此,在编写代码时,我们应该尽可能避免使用 textsize() 方法。

根据警告信息,你可以将代码中的 textsize() 方法替换为 textbbox()textlength() 方法。例如,将上面的代码修改为:

width, height = image.size
draw = ImageDraw.Draw(image)
font = ImageFont.truetype(font_path, font_size)
text_width, text_height = draw.textbbox((0, 0), text, font=font)
x = int((width - text_width) / 2)
y = int((height - text_height) / 2)
draw.text((x, y), text, font=font, fill=fill)

在上面的代码中,我们使用 textbbox() 方法来计算文本的宽度和高度,然后根据图片大小和文本大小来计算出文本在图片中的位置,最后将文本绘制到图片上。这样可以避免使用 textsize() 方法时出现的警告。

异常draw.textbbox

text_width, text_height = draw.textbbox((10, 10), text, font=font)代码这个地方抛出异常Error: too many values to unpack (expected 2)

这个错误通常是由于 textbbox() 方法返回的四元组 (x0, y0, x1, y1) 与期望的二元组 (text_width, text_height) 不匹配引起的。

要解决这个问题,您可以使用四元组中的左上角坐标 (x0, y0) 和右下角坐标 (x1, y1) 计算文本的宽度和高度,例如:

# 计算文本框大小
bbox = draw.textbbox((10, 10), text, font=font)

# 计算文本宽度和高度
text_width = bbox[2] - bbox[0]
text_height = bbox[3] - bbox[1]

这里,我们使用 bbox[2] - bbox[0] 计算文本的宽度,使用 bbox[3] - bbox[1] 计算文本的高度。这样,就可以将计算出的宽度和高度存储在 text_widthtext_height 变量中,以供后续使用。

请注意,在使用 textbbox() 方法时,返回的四元组中的值的顺序是 (x0, y0, x1, y1),因此,您需要根据需要来提取相应的值。

from PIL import Image, ImageDraw, ImageFont


def add_watermark(image_path, text, font_path, font_size=40, opacity=0.5, fill=(255, 102, 0, 128)):
    """
    在图片上添加水印
    :param image_path: 图片路径
    :param text: 水印文本
    :param font_path: 字体文件路径
    :param font_size: 字体大小,默认为 40
    :param opacity: 水印透明度,默认为 0.5
    :param fill: 水印颜色,默认为白色半透明
    :return: None
    """
    with Image.open(file_path) as image:
        draw = ImageDraw.Draw(image)
        width, height = image.size
        font = ImageFont.truetype(font_path, font_size)
        print(333)
        # text_width, text_height = draw.textbbox((10, 10), text, font=font)
        # 计算文本框大小
        bbox = draw.textbbox((10, 10), text, font=font)
        # 计算文本宽度和高度
        text_width = bbox[2] - bbox[0]
        text_height = bbox[3] - bbox[1]
        print(f"=== text_width, text_height  {text_width, text_height }")
        x = int((width - text_width) / 2)
        y = int((height - text_height) / 2)
        draw.text((x, y), text, font=font, fill=FILL)
        image.save(file_path)
中文显示异常

原始图片
【Python】PIL给图片添加水印最全代码解释

调用方式:

if __name__ == '__main__':
    
    add_watermark('test.png', '测试!', 'simsunb.ttf', font_size=50)

【Python】PIL给图片添加水印最全代码解释

我们期待图片中间有:测试!,水印显示在图片上,实际结果我们已经看到,看来还是哪里有问题;

修改中文字体库引用就可以了

if __name__ == '__main__':

    # add_watermark('test.png', '测试!', 'simsunb.ttf', font_size=50)
    add_watermark('test.png', '测试!', r'C:\Windows\Fonts\微软雅黑\msyh.ttc', font_size=50)

【Python】PIL给图片添加水印最全代码解释

刚才我用了:C:\Windows\Fonts\微软雅黑\msyh.ttc这个路径,跟大家提一下这是Windows系统字体默认的存储位置;

到这里就实现给图片添加水印的基本操作了,赶紧动手试试吧;文章来源地址https://www.toymoban.com/news/detail-447750.html

到了这里,关于【Python】PIL给图片添加水印最全代码解释的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Python代码学习之给图片添加文字或图片水印

    图片加水印有什么好处?在现今的数字化时代,网络上的图片泛滥,盗图现象也越来越严重。因此,在发布文章时,为了保护自己的原创作品版权,很多人选择使用水印来保护他们的图片。这样就能更好地做到: 1.版权保护:在商业用途的照片中添加水印可以帮助保护作者的

    2024年02月09日
    浏览(40)
  • Python图像处理实战:使用PIL库批量添加水印的完整指南【第27篇—python:Seaborn】

    在日常图像处理中,为图片添加水印是一项常见任务。有多种方法和工具可供选择,而今天我们将专注于使用Python语言结合PIL库批量添加水印。 需要注意的是,所选用的图片格式不应为JPG或JPEG,因为这两种格式的图片不支持透明度设置。 先前的文章已经详细介绍过PIL库,这

    2024年01月16日
    浏览(33)
  • 100天精通Python(实用脚本篇)——第112天:图像处理批量给图片添加水印,防盗必备建议收藏!!!(附上脚本代码)

    🔥🔥 本文已收录于 《100天精通Python从入门到就业》:本专栏专门针对零基础和需要进阶提升的同学所准备的一套完整教学,从0到100的不断进阶深入,后续还有实战项目,轻松应对面试,专栏订阅地址:

    2024年01月23日
    浏览(48)
  • 通过Python的PIL库给图片添加马赛克

    大家好,我是空空star,本篇给大家分享一下通过Python的PIL库给图片添加马赛克。 Pillow是一个Python图像处理库,它是Python Imaging Library(PIL)的一个分支。Pillow提供了广泛的图像处理功能,包括图像格式转换、图像增强、图像滤波、图像调整、图像合成等。使用Pillow,开发人员

    2024年02月06日
    浏览(37)
  • Python操作Word水印:添加文字或图片水印

    在Word文档中,可以添加半透明的图形或文字作为水印,以保护文档的原创性,防止未经授权的复制或使用。除了提供安全功能外,水印还可以展示文档创作者的信息、附加的文档信息,或者仅用于文档的装饰。本文将介绍如何使用 Spire.Doc for Python 在程序中的轻松 添加文字和

    2024年02月08日
    浏览(35)
  • 通过Python的filestools库给图片添加全图水印

    大家好,我是空空star,本篇给大家分享一下通过Python的filestools库给图片添加全图水印。 filestools目前包含四个工具包,分别是树形目录显示、文件差异比较、图片加水印和curl请求转python代码。 Name: filestools Version: 0.1.3 Summary: 仿Linux的tree命令、文件差异比较工具、图片加水印

    2023年04月27日
    浏览(36)
  • Python 基于 OpenCV 视觉图像处理实战 之 OpenCV 简单视频处理实战案例 之十一 简单给视频添加水印图片效果

    目录 Python 基于 OpenCV 视觉图像处理实战 之 OpenCV 简单视频处理实战案例 之十一 简单给视频添加水印图片效果 一、简单介绍 二、简单给视频添加水印图片效果实现原理 三、简单给视频添加水印图片效果案例实现简单步骤 四、注意事项 Python是一种跨平台的计算机程序设计语

    2024年04月25日
    浏览(41)
  • 给图片添加图片水印

            react + antd 4.x(此版本没有watermark水印),需要将后端传递的图片添加图片水印 1、水印添加问题 2、水印添加完成后显示问题         将watermark水印图片和img需要添加水印的图片同时创建了,以至于在img创建成功后watermark有可能还没有创建成功,导致没有进入

    2024年02月21日
    浏览(27)
  • uniapp制作水印相机给图片添加水印并且保存图片至本地

    文件主要分为两大类: 1.代码包文件:代码包文件指的是在项目目录中添加的文件。 2.本地文件:通过调用接口本地产生,或通过网络下载下来,存储到本地的文件。 其中本地文件又分为三种: 1.本地临时文件:临时产生,随时会被回收的文件。运行时最多存储 4GB,结束运

    2024年02月11日
    浏览(38)
  • 图片添加水印,仿照水印相机样式,定位时间备注等

    开发思路1、将每个元素添加分别单独到背景图片上,调整位置和透明度 开发思路2、将水印信息先整合为一张水印图片,再将水印图片添加到背景图片,调整位置和透明度 因为考虑到不同图片尺寸大小等问题,元素内容又多,根据思路1,定位问题太麻烦,而且还因调整大小

    2024年02月20日
    浏览(29)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包