之前写菲律宾游记,想给自己的照片批量打上水印,首先想到的就是用Python实现给图片加文字,然后写个循环。

做过图像识别的,应该知道OpenCV,其中cv2.putText()函数,就可以实现在图片上加文字,非常简单。

putText(img, text, org, fontFace, fontScale, color, thickness, lineType, bottomLeftOrigin)

参数解释:
img:需要添加文字的图片。
text:要加的文字内容。
org:文字的位置坐标。
fontFace:字体类型(可选择字体有限,可设置斜体)。
fontScale:字体大小。
color:字体颜色。
thickness:字体粗细。
lineType:线型。
bottomLeftOrigin:默认值为false,图片数据原点在左上角。

但putText()有个问题,不能添加中文文字,也不能指定字体,而PIL(Python Image Library)可以解决这个问题。

Image模块

Image是PIL中的核心模块,实现对图片的基础操作。

Image中的函数:

  1. Image. open(path):打开现成的图片,该图片在path所示的路径中。

  2. Image. new(mode, size, color):创建新的图片文件,color默认为黑色。

Image对象的属性:

  1. image.format:查看图像的格式,常见的有JPG、PNG等。

  2. image.mode:查看图像的模式。常用的例如RGB,3x8位像素,为真彩色;RGBA,4x8位像素,有透明通道的真彩色。

  3. image.size:获取图片的尺寸(长×宽),该二元组也表示图片的像素。

import os
import sys
from PIL import Image, ImageFont, ImageDraw# 读入要打水印的照片
image = Image.open('./input/IMG_1422.jpg')
im_size = image.sizeprint(image.format)
print(image.mode)
print(im_size)
image.show()----------------------
[out] JPEG
[out] RGB
[out] (1536, 2048)

原始照片:

ImageDraw模块

ImageDraw模块,提供对图像进行绘制的方法。

  1. ImageDraw.Draw(image):创建画刷。

  2. ImageFont.truetype(file, size) :设置字体和大小,file提供字体的路径,size为文字大小。在C盘(系统盘)-Windows-Fonts里面,有计算机上安装的所有字体,选一个喜欢的。

  3. draw.text(xy, text, fill, font):根据位置、内容、颜色、字体把文字写进图片中。
    xy:位置,即距离图片左上角起始点的坐标。
    这里普及一下图片坐标系统的概念。
    图片坐标常用二元组(x,y),(0,0)位于左上角。
    四元组表示图片左、上、右、下的坐标,例如800x600像素的长方形图片表示为(0,0,800,600)。
    text:字符串,即文字内容。
    fill:文字颜色。
    font:字体和大小,通过上述ImageFont来定义。

用draw.text()加水印文字,特别简单!

########### 加文字 ###########
draw_txt = ImageDraw.Draw(image)
txt_size = int(im_size[0]*0.02)# 设置字体和文字大小
chi_font = ImageFont.truetype('./font/fzstk.ttf', size=txt_size)# 直接在照片上写文字
draw_txt.text(xy = (im_size[0]//2-txt_size//2,im_size[1]-int(txt_size*1.2)),text = '@化简可得',font = chi_font)image.show()

Image中的方法

  1. image.show():展示图像,Win系统下show会打开系统自带的图像显示程序。
  2. image.transpose(method):图像翻转或者旋转,例如ROTATE_90表示将图像逆时针旋转90°。
  3. image. thumbnail (size):制作缩略图,参数size指定最大的宽度和高度。
  4. image.paste(region, box, mask):将一张图粘贴到另一张图上。
    image:底图;
    region:要粘贴上底图的图,即水印图片;
    box:要粘贴的位置,2元组表示左上角坐标;
    mask:对应的模板图像来填充所对应的区域,模板图像的尺寸必须与region对应的图像尺寸一样,原图像和模板图像可以为同一个图。
  5. image. save(path, quality):针对JPG格式,quality参数表示保存图像的质量,值的范围从1(最差)到95(最佳)。 默认值为75,此时图片会被压缩。

用image.paste()加水印图,也特别简单!

########### 加图片 ###########
# 读入水印图
# 还没设计过自己的水印logo,所以随便在网上找了一个小太阳做示范
mark_image = Image.open('./sun.png')# 这个小太阳有点大,压缩一下
mark_image.thumbnail((150, 150)) # 将小太阳加在照片左上角的位置
position = mark_size//3, mark_size//3
image.paste(mark_image, position, mark_image)image.show()

小结

新建watermark文件夹,该文件夹下放入Python文件,并新建3个子文件夹:

  1. font文件夹存放字体;
  2. input存放原始图片;
  3. output文件夹为空,程序跑完后打好水印的图片会输出到该文件夹。

背景水印打法可以看这篇:https://zhuanlan.zhihu.com/p/138732523

水印效果

python marker.py -f ./input -m 化简可得 -c #232862 --opacity 0.08 -s 200 --size 100

跑批代码,下面自取~

########## 批量加水印文字 #########
import os
import sys
from PIL import Image, ImageFont, ImageDrawdef add_watermark(image_file): image = Image.open(image_file)draw_txt = ImageDraw.Draw(image)im_size = image.sizeprint('原始图片尺寸:',im_size)if im_size[0]>im_size[1]: #如果是横版txt_size = int(im_size[0]*0.02)else:txt_size = int(im_size[1]*0.02)print('水印文字尺寸:',txt_size)# 设置字体和文字大小chi_font = ImageFont.truetype('./font/fzstk.ttf', size=txt_size)# 直接在照片上写文字draw_txt.text(xy = (im_size[0]//2-txt_size//2, im_size[1]-int(txt_size*1.2)),text = '@化简可得',font = chi_font)name = os.path.basename(image_file)new_name = os.path.join('.\output', name)image.save(new_name, quality=95)### 循环读入照片
files = os.listdir('.\input')
for file in files:image_file = os.path.join('.\input', file)print(image_file)add_watermark(image_file)
########## 批量加水印照片 #########
import os
import sys
from PIL import Image, ImageFont, ImageDraw# 读入水印图
mark_image = Image.open('./sun.png')def add_watermark(image_file): image = Image.open(image_file)    im_size = image.sizeprint('原始图片尺寸:',im_size)if im_size[0]>im_size[1]: #如果是横版mark_size = int(im_size[0]*0.08)else:mark_size = int(im_size[1]*0.08)mark_image.thumbnail((mark_size, mark_size))print('水印图片尺寸:',mark_image.size)position = mark_size//3, mark_size//3image.paste(mark_image, position, mark_image)name = os.path.basename(image_file)new_name = os.path.join('.\output', name)image.save(new_name, quality=95)# 循环读入照片
files = os.listdir('.\input')
for file in files:image_file = os.path.join('.\input', file)print(image_file)add_watermark(image_file)

当然,网上有很多现成的软件,也能实现批量打水印。但我还是喜欢用Python,以后想要什么样的效果,改改参数就好了~

参考链接

  1. Win10 + Opencv3 for Python 的安装过程 https://www.jianshu.com/p/c3af3cadf372

  2. Py之cv2:cv2库的简介、安装、使用方法(常见函数、方法等)最强详细攻略
    https://blog.csdn.net/qq_41185868/article/details/79675875#%E5%85%B3%E4%BA%8EOpenCV%E7%AE%80%E4%BB%8B

  3. python PIL 图像处理库简介(一) https://www.cnblogs.com/lyrichu/p/9124504.html

  4. python PIL的Image.resize()和Image.thumbnail()函数的区别
    https://blog.csdn.net/TeFuirnever/article/details/90597048

Python应用之批量打水印相关推荐

  1. python图片批量处理器_用python给图片批量打水印

    之前写菲律宾游记,想给自己的照片批量打上水印,首先想到的就是用Python实现给图片加文字,然后写个循环. 做过图像识别的,应该知道OpenCV,其中cv2.putText()函数,就可以实现在图片 ...

  2. 利用Python自制一个批量图片水印添加器

    前段时间写了个比较简单的批量水印添加的python实现方式,将某个文件夹下面的图片全部添加上水印. 今天正好有时间就做了一个UI应用的封装,这样不需要知道python直接下载exe的应用程序使用即可. ...

  3. python基础代码技巧_5行Python代码实现批量打水印技巧,值得收藏|python基础教程|python入门|python教程...

    在线工具需要上传到对方服务器,信息不安全. 很多工具不具备批量处理功能. 很多工具自定义的功能太少,如水印透明度,字体等. 操作繁琐. 现在只要你会使用命令,我们就能教大家怎么使用 Python 超级 ...

  4. 干货案例!Python实现视频批量加水印,仅需50行代码

    最近由于工作安排,同事需要经常大批量给视频添加水印,昨天反馈给我说,用的某软件批量添加水印过程真的很繁琐,效率也很低,加一个水印要好几分钟时间,你能不能帮我开发一个小工具直接达到"一键添加& ...

  5. python水印倾斜_5行Python代码实现批量打水印技巧,值得收藏

    在线工具需要上传到对方服务器,信息不安全. 很多工具不具备批量处理功能. 很多工具自定义的功能太少,如水印透明度,字体等. 操作繁琐. 这里还要注意:光理论是不够的.这里顺便总大家一套2020最新py ...

  6. python 实现图片批量加入水印!

    文章的时候可以设置是否添加水印.可是,有些图片可能想加水印,有些不想加水印,该怎么办呢? 配置环境 python3 + pillow pip3 install pillow 引入库 from PIL ...

  7. python pdf 图片水印_怎样用python给pdf批量添加水印并加密

    很多时候需要给pdf添加水印,而且还要加密文件,这些在Python中是如何实现的呢?学过编程的小伙伴准备好迎接今天的挑战吧. 1.设置路径 import os os.getcwd() os.chdir ...

  8. Python实用案例,Python脚本,Python实现批量加水印

    往期回顾 Python实现自动监测Github项目并打开网页 Python实现文件自动归类 Python实现帮你选择双色球号码 Python实现每日更换"必应图片"为"桌 ...

  9. 用 Python 批量加水印

    有时候,为了保护版权,需要给作品中的图片加上水印. 一种是把水印(logo)加在图片的一个角落,就像有的是微信公众号会在后台把水印打开. 更厉害的一种是,水印在整个图上有很多,有个轻微的透明度,更安全 ...

最新文章

  1. Go image: unknown format 错误解决
  2. CentOS上安装Python3.7.4
  3. python传输大文件_python之socket运用之传输大文件
  4. Android中使用Thread线程出现的问题
  5. laravel php环境,Laravel 5框架学习之环境与配置
  6. 位置采集[置顶] iPhone手机上的GPS位置信息采集与分享应用
  7. Enterprise Library 缓存应用程序块快速入门
  8. Python中的numpy.append()
  9. vs 中程序被锁定的问题
  10. Solidity基础入门知识---函数的访问权限和可见性
  11. oracle的unload,Oracle 业务数据unload恢复过程
  12. Ruijie SSL V P N 垂直越权漏洞
  13. 基于Chrome插件的微博超话自动签到
  14. 美团2021届秋季校园招聘笔试真题解析:小美的跑腿代购
  15. drcom宽带认证登录超时_DrCOM客户端常见问题解决方法
  16. transact sql mysql_MySQL与Transact SQL(MS SQL Server)的SQL语句区别点滴(C++)
  17. 【181029】FreeEIM 飞鸽传书仿QQ即时通讯软件VC++源代码
  18. 初学者,日益维新,记录所学点点滴滴
  19. Redis——商品秒杀之库存遗留问题
  20. 5.1 上网本安装安卓x86_X86笔记本安装Android 4.0全教程 安卓4.0开发环境搭建

热门文章

  1. xposed模块开发第一篇
  2. 从网上骂人言论看其浮躁无知的一面
  3. 复旦的新衣再登Nature!穿在身上能为手机充电
  4. SQL每日一题 牛客17 10月的新客户单价和获客成本
  5. 5.1.7—二叉树的遍历—Recover Binary Sear Tree
  6. python格式规范的要求_Python书写规范
  7. 日均5亿查询量,京东到家订单中心的ES架构演进
  8. 电脑上复制、粘贴及剪切功能用不了是什么原因
  9. 汇编指令: JO、JNO、JB、JNB、JE、JNE、JBE、JA、JS、JNS、JP、JNP、JL
  10. Epub文件解析库-- Epublib