欢迎关注个人公众号 DailyJobOps

阅读大纲

  • 图片水印忽大忽小问题研究
  • 中文水印乱码问题
  • 水印的动态展示

背景

在上次CSDN中发表技术文章的时候,文章中涉及到图片,CSDN会自动上传然后添加水印,突然注意到上传之后的图片的水印超级小,就在右下角一丢丢点,不注意还以为没有添加呢,然后对比这里之前文章的水印发现显示挺正常合适的。

为啥有时候显示的很适合,有时候显示的特别小呢?

然后去微信公账号的平台测试下了,同样的图片,微信公众号显示合适(比例、位置等看来正常,不是忽大忽小)

研究问题所在

之前用Python写过给图片添加水印的小工具,然后用该工具经常测试、验证问题所在。

经过使用不同尺寸和大小的图片测试和验证发现问题所在。出现在两个点上

1、水印举例图片边距是固定的,比如都是10px
2、文字水印没有设置字体或者设置了固定大小

针对第一个点,比如图片A尺寸 300px * 200px,如果默认边距是10px。

下面这个是测试使用的Demo程序

#!/usr/bin/env python
# -*- coding: utf-8 -*-
# @Time     : 2021/12/18 5:51 下午
# @Author   : Colin
# @Email    : colin@colinspace.com
# @File     : testImageWatermark.py
# @Software : PyCharm
#from PIL import Image
from PIL import ImageDraw# 定义一个水印
watermark = "Hello Python!"
# 定义边距,水印举例原始图片的边距
border = 10
# 先画一个尺寸为200*300背景色为灰色的图片;然后通过设置不同的尺寸来观察水印的位置和大小
# img = Image.new('RGBA', (300, 200), 'gray')
# img = Image.new('RGBA', (900, 600), 'gray')
img = Image.new('RGBA', (3000, 2000), 'gray')
text_layer = ImageDraw.Draw(img)
# 计算水印文字的大小,为了更精确的存放水印位置
text_xy = text_layer.textsize(watermark)
# 注意计算位置,添加水印一般都是 左上角、右上角、右下角、左下角或者中心位置等特殊点;最常见的就是在右下角
# 计算水印在右下角的位置
watermark_xy = (img.size[0] - text_xy[0] - 10, img.size[1] - text_xy[1] - 10)
# print("原始图片的大小: ", img.size)
# print("水印文字的大小: ", text_xy)
# print("水印文字的位置: ", watermark_xy)
text_layer.text(watermark_xy, watermark, fill='orange')
img.show()

通过调整原始图片的大小,然后展示最终的结果很容易发现问题,为了节约篇幅,把三次测试结果调整到一个截图中缩放到相同的尺寸,可以看到图片越大,水印(水印本身的大小没有发生变化)越来越小

同样的,如果设置了水印的字体,但是字体大小固定,即使边距随之动态变化,那么情况也和上面类似,只是水印的位置不固定了而已。

因为设置字体设计到 中文水印乱码 的问题,我们放到第二趴介绍。

同时这里思考一个问题,如何实现水印边距随之动态变化 ?


中文水印乱码

中文水印乱码或者更正确的说是中文水印导致的报错问题。

报错信息如下

原因就是未配置字体导致的,至于为什么,可以查看pillow的源码中ImageFont.py ImageFont 类中getmask方法中提示

If the font uses antialiasing, the bitmap should have mode ``L``
and use a maximum value of 255. Otherwise, it should have mode ``1``.

我们修改最开始的Demo,添加如下代码

# 定义字体
font_path = "/Users/colinspace/Library/Fonts/LXGWWenKai-Regular.ttf"
font = ImageFont.truetype(font_path, 20)# 修改添加font
text_xy = text_layer.textsize(watermark, font=font)
text_layer.text((100, 50), watermark, fill='orange', font=font)

最终的完整Demo代码详见 testImageWatermark.py


水印的动态展示

水印的动态上面提到需要解决两个问题

1、水印距离原始图片的动态边距
2、水印字体大小的动态设定

为了解决动态设定 使之随图片尺寸而变化。最简单的就是通过百分比 来实现,取长或者宽的百分比。代码如下

# 左右间距,采用图片比例的扩展,可以有效解决不同大小图片,水印位置相对一致
border = 0
if im.size[0] > im.size[1]:border = int(im.size[1]/100*3)
else:border = int(im.size[0]/100*3)# 设置字体
font_path = "/Users/colinspace/Library/Fonts/LXGWWenKai-Regular.ttf"
# 字体大小设置为上面定义的border,这样可以修复遇到超大图片时因为设定固定字体导致文字水印过小的问题
font = ImageFont.truetype(font_path, border)

最终完善工具脚本支持

1、中文、英文 文字水印
2、图片水印
3、修复因为图片过大导致 文字水印超小的问题
4、解决中文水印乱码问题
5、支持添加到不同的位置,左上角、右上角、左下角、右下角、中心位置
6、支持设置水印颜色

最终完整脚本详见: python添加水印工具

或者 CSDN的资源下载


可以关注公众号,第一时间获取最新分享哦~


References

[1] testImageWatermark.py: https://gitee.com/colin5063/cws-tools/blob/master/python/testImageWatermark.py
[2] python添加水印工具: https://gitee.com/colin5063/cws-tools/blob/master/python/cws_image.py

Python实现图片添加水印(支持中文、英文和图片)相关推荐

  1. php 怎么支持中文图片显示,给图片添加水印(支持中文)并生成缩略图_php

    // **************************************** // // 功能:给图片添加水印(支持中文)并生成缩略图 // 参数: $srcFile 图片文件名 // $d ...

  2. 微信小程序生成二维码可文字,链接,图片(支持中文)

    功能简介 : 微信小程序生成二维码,支持文本和网址,支持中英文,输入框可清空,可单击保存二维码...... 核心代码 : createQrCode:function(url,canvasId,cavW ...

  3. LaTeX支持中文英文混排编译的三种方式—Slager!

    介绍 LaTeX 源代码的开头须用 \documentclass 指定文档类: \documentclass[(options)]{(class-name)} 其中 (class-name) 为文档类 ...

  4. 怎么给图片添加水印?教你一个图片加水印小妙招

    怎么给我们自己的图片添加上水印呢?在我们的日常生活中,我们会拍摄一些图片或者是自己通过制作软件来绘制出一些好看的图片上传到网上,很多小伙伴会通过这种方式来获取流量或关注度,甚至是产生一些利益,但是,由 ...

  5. vue上传图片加水印;js上传图片添加水印;vue给图片添加水印;canvas图片添加水印;canvas画布导出图片

    uni-app微信小程序图片加水印,点击看这篇 需求场景: 要求上传图片,并给图片添加水印.传给后端的也是有水印的图片. 逻辑步骤: 通过input上传图片,拿到图片的信息和base64,将图片绘制到 ...

  6. vim不支持python3_彻底颓了—— Vim Python 3 接口不支持中文

    折腾了好久才编译出来一个支持 Python 3 的 Vim,谁知居然有这么多问题. 除了 vim.current.buffer 对象不再支持 slice 类型参数以外,今天又发现这个: 结果在 Vim ...

  7. python3支持中文_彻底颓了—— Vim Python 3 接口不支持中文 - Jacky Liu's Blog

    折腾了好久才编译出来一个支持 Python 3 的 Vim,谁知居然有这么多问题. 除了 vim.current.buffer 对象不再支持 slice 类型参数以外,今天又发现这个: :py3 vi ...

  8. python 利用utf-8编码判断中文英文字符

    下面这个小工具包含了判断unicode是否是汉字.数字.英文或者其他字符,全角符号转半角符号,unicode字符串归一化等工作. #!/usr/bin/env python # -*- coding: ...

  9. python语言的特点支持中文_Python编程语言特征

    详细内容 Python编程语言特征 1.Python语法优雅,程序编码简单易读. 2.Python易上手,通过简单的操作就能让你写的程序运行.Python非常适合用来做原型开发或其他专门的编码任务,同 ...

  10. python 生成随机数据,随机中文,英文,数字,姓名等

    笔者也经常在网上查询信息,但发现很多信息都是照搬,内容甚至有错误,可用性很低.笔者就认为如果要分享就应该把遇到的问题真实的分享出来,让更多同路人少走弯路.节约时间. 觉得这篇文章有帮助的同学可以点个赞 ...

最新文章

  1. 早上突然看明白 shader和材质球的关系
  2. 资源 | 2018年值得关注的200场机器学习会议(建议收藏)
  3. HTTPS协议之SSL/TLS协议四次握手
  4. VMware Resource Pool Recommendations
  5. DHCP 服务原理:Snooping和Relay
  6. Windows 自启动总结《转》
  7. open函数返回-1_记录学习python的第3天-递归函数/文件操作
  8. 电商后台、手机端、小程序、H5、电商原型、需求池、产品结构图、接口流程、高保真交互、PRD、布局说明、数据统计、店铺管理、商品管理、财务管理、售后、订单、会员、客服、标签、Axure原型、产品原型
  9. jxl freemark
  10. 机载 LiDAR 点云数据分类
  11. 木子网罗数据库笔试题(一)
  12. 中国绿色PPP项目行业现状及发展建议:投资规模不断扩大,需要改善存在的问题,进一步推动绿色PPP健康发展[图]
  13. matlab exm,exm 《Experiments with MATLAB》这本书的程序源码,附中文注释,简单易懂,是学习 238万源代码下载- www.pudn.com...
  14. 创建和添加电子邮件签名
  15. Java八种基本数据类型定义与取值范围
  16. 摄像头能用计算机里不显示,Windows7“计算机”不显示已连接的摄像头图标怎么办?...
  17. jeecg-boot 入门-小白避坑篇
  18. 李峋同款爱心Python代码版来了
  19. 理解RxJava线程模型
  20. mwb 还原 mysql_[MySQL]WorkBench管理操作MySQL

热门文章

  1. Java第二课(多线程,jdbc,io)
  2. .NET Core Web API使用HttpClient提交文件的二进制流(multipart/form-data内容类型)
  3. OpenGL教程翻译 第二十五课 天空盒
  4. 怎样可以快速高效查询芯片的信息?分享几个查芯片的方法
  5. 【Spring Security】安全框架学习(十三)
  6. 被ddos攻击了怎么办,阿里云又太贵了
  7. 转载: 8天学通MongoDB——第三天 细说高级操作
  8. Typora使用方法
  9. 怎么恢复回收站清空删除的文件
  10. 智力测试情商测试小程序源码/带流量主提升智力微信小程序源码