百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 技术文章 > 正文

用python给图片批量打水印

itomcoil 2025-05-24 14:42 1 浏览

之前写菲律宾游记,想给自己的照片批量打上水印,首先想到的就是用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.size

print(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文件夹为空,程序跑完后打好水印的图片会输出到该文件夹。


跑批代码,下面自取~

########## 批量加水印文字 #########
import os
import sys
from PIL import Image, ImageFont, ImageDraw

def add_watermark(image_file): 
    image = Image.open(image_file)
    draw_txt = ImageDraw.Draw(image)

    im_size = image.size
    print('原始图片尺寸:',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.size
    print('原始图片尺寸:',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//3
    image.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

相关推荐

点过的网页会变色?没错,这玩意把你的浏览记录漏光了

提起隐私泄露这事儿,托尼其实早就麻了。。。平时网购、换手机号、注册各种账号之类的都会咔咔泄露,根本就防不住。但托尼真是没想到,浏览器里会有一个看起来完全人畜无害的功能,也在偷偷泄露我们的个人隐私,而且...

Axure教程:高保真数据可视化原型

本文将介绍如何制作Axure高保真数据可视化原型,供大家参考和学习。高保真数据可视化原型设计,称得上是Axure高阶水平。数据可视化在原型设计中是一个重要的分支,但是对于Axure使用者具有一定要求。...

Flutter web开发中禁用浏览器后退按钮

路由采用的go-router路由框架:finalrootNavigatorKey=GlobalKey<NavigatorState>();finalGoRouterrouter...

jQuery 控制属性和样式

标记的属性each()遍历元素:each(callback)方法主要用于对选择器进行遍历,它接受一个函数为参数,该函数接受一个参数,指代元素的序号。对于标记的属性而言,可以利用each()方法配合th...

微信小程序入门教程之二:页面样式

这个系列的上一篇教程,教大家写了一个最简单的Helloworld微信小程序。但是,那只是一个裸页面,并不好看。今天接着往下讲,如何为这个页面添加样式,使它看上去更美观,教大家写出实际可以使用的页...

如何在Windows11的任务栏中禁用和删除天气小部件图标?

微软该公司已在Windows11的任务栏中添加了一个天气小部件图标,作为小部件的入口点。这个功能与之前Win10上的新闻与资讯功能相同,但是有的用户不喜欢想要关闭,不知道如何操作,下面小编为大家带来...

CSS伪类选择器大全:提升网页交互与样式的神奇工具

CSS伪类选择器是前端开发中不可或缺的强大工具,它们允许我们根据元素的状态、位置或用户行为动态地应用样式。本文将全面介绍常用的伪类选择器,并通过代码示例展示其实际应用场景。一、基础交互伪类1.超链接...

7个Axure使用小技巧

编辑导读:对于Axure原型工具,很少有产品经过系统学习,一般都是直接上手,边摸索边学习,这直接导致很多快捷操作被忽视。笔者在日常工作中总结出以下小技巧,希望对各位有帮助。之前整理了2期Axure的...

JavaScript黑暗技巧:禁止浏览器点击“后退”按钮

浏览网页时,当从A页面点击跳转到B页面后,一般情况下,可以点击浏览器上的“后退”按钮返回A页面。如果进入B页面后,B页面想让访问者留下,禁止返回,是否可以实现呢?这简直是要控制浏览器的行为,虽然有些邪...

对齐PyTorch,一文详解OneFlow的DataLoader实现

撰文|赵露阳在最新的OneFlowv0.5.0版本中,我们增加了许多新特性,比如:新增动态图特性:OneFlow默认以动态图模式(eager)运行,与静态图模式(graph)相比,更容易搭建网...

Python计算机视觉编程 第一章 基本的图像操作和处理

以下是使用Python进行基本图像操作和处理的示例代码:使用PIL库加载图像:fromPILimportImageimage=Image.open("image.jpg"...

PyTorch 深度学习实战(31):可解释性AI与特征可视化

在上一篇文章中,我们探讨了模型压缩与量化部署技术。本文将深入可解释性AI与特征可视化领域,揭示深度学习模型的决策机制,帮助开发者理解和解释模型的内部工作原理。一、可解释性AI基础1.核心概念特征重要...

学习编程第177天 python编程 富文本框text控件的使用

今天学习的是刘金玉老师零基础Python教程第72期,主要内容是python编程富文本框text控件。一、知识点1.tag_config方法:利用某个别名作为标签,具体的对应标签的属性功能配置在后面参...

用Python讓電腦攝像頭實現掃二維碼

importsys#系統模組,用來存取命令列參數與系統功能importcv2#OpenCV,處理影像與相機操作importnumpyasnp#Numpy,用來處理數值與...

使用Transformer来做物体检测

作者:JacobBriones编译:ronghuaiyang导读这是一个Facebook的目标检测Transformer(DETR)的完整指南。介绍DEtectionTRansformer(D...