python给图片加水印很简单!你选Opencv还是PIL?
off999 2024-10-29 14:56 44 浏览 0 评论
一个偶然的需求,要给图片批量添加水印。一开始想到用ps做,但是无奈后面图片实在有点多了,就萌生了用python处理的想法。
在百度上找了很多的相关文章,大部分都不太行,有的要么是不能正常运行,有的是处理后效果不好。
在这个过程中,我也尝试了各种方法,填了很多坑,在这里就给大家说一说,我尝试过的方法,避免大家再次踩坑。
首先想的是用OpenCV-Python
使用opencv是因为觉得它足够强大,很多图像处理这块都是用的它,想着用opencv添加个水印,总不是什么难事儿吧!没想到却翻车了!
首先安装opencv-python:
pip install opencv-python安装完成后,在.py脚本中导入:
import cv2导入程序包,接下来就是读入图片和logo水印:
image = cv2.imread(img_path, cv2.IMREAD_UNCHANGED)
logo = cv2.imread(img_path, cv2.IMREAD_UNCHANGED)cv2.imread(filepath,flags)这个函数,是用来读取图片的:
- filepath:这个参数是指定图片的文件路径
- flags:这个参数确定图片的参数
- cv2.IMREAD_COLOR:默认参数,读入一副彩色图片,忽略alpha通道,也就是如果是一张png图片的话,读入之后,png的透明部分会变成黑色,成为一张RGB图。
- cv2.IMREAD_GRAYSCALE:读入灰度图片
- cv2.IMREAD_UNCHANGED:顾名思义,读入完整图片,包括alpha通道。用这个参数,如果原图是png格式的透明图片的话,就会完整读入了,这时候是RGBA图,如果是jpg图片,那么读取后就是一张RGB图。
但是要注意这几个参数,读取图片后的这个返回对象有所不同,对于IMREAD_COLOR读取的对象,是一个三维的矩阵,IMREAD_GRAYSCALE读取的对象是一个二维矩阵,IMREAD_UNCHANGED读取PNG图返回的是个RGBA的四维矩阵,读取JPG图时是一个三维矩阵,读取灰度图时是一个二维矩阵。
一般要处理的图片都是JPG或者PNG格式的,也不确定是否是RGBA图像,因此采用IMREAD_UNCHANGED方式读入最合适,但是要额外处理下特殊情况。
image.shape保存了图像的高度,宽度,和维度:
(h, w, d) = image.shape然后根据维度来处理,统一处理成四维图像:
if d == 3:
# 构建一个和输入图像完全一致的叠加层,
# 此Alpha通道具有与原始图像相同的空间尺寸,
# 并且Alpha通道中的所有值均设置为255,指示像素完全不透明。
image = np.dstack([image, np.ones((h, w), dtype="uint8") * 255])接下来就是要处理logo水印了,要知道,这里将采用图像叠加的方案,把水印放在原图像上,因此首先要创建一个与原图像大小一致的叠加层,你可以理解为蒙版。
# 构建水印图片的叠加层(使得其具有与输入图像完全相同的宽度和高度),透明度全部设为0,即完全透明
overlay = np.zeros((h, w, 4), dtype="uint8")然后通过计算位置,得出你要把logo放置在图像的哪个位置上,然后将logo图像的数据覆盖到overlay上面对应位置。
获取logo的宽和高:
(lh, lw, ld) = logo.shape这里就将logo放在右上角距离顶部30px右侧边界52px的位置吧!
overlay[30:lh + 30, w - lw - 52:w - 52] = logo最后一步,就是将这层放置了logo的“蒙版”叠加到原始图像上了。
这里使用了cv2.addWeighted(src1, alpha, src2, beta, gamma, dst=None)这个函数,这个函数是用来将两个图像按照权重叠加的,权重的高低,也就决定着图像的透明度,从0-1.0的范围取数,1.0就意味着权重最高,不透明。不过注意这个透明度是在原图的基础上,再去施加透明度,而不是改变原有图像的透明度的。
# 应用cv2.addWeighted构造水印的图像
cv2.addWeighted(src1=overlay, alpha=0.8, src2=image, beta=1.0, gamma=0, dst=image)然后将图片保存,写入硬盘某个文件路径。
# 把加了水印的图片写入磁盘
cv2.imwrite(dst_img_path, image)写到这里兴奋地不行,因为马上就能看到效果了。我找了一张大家都爱看的图片做测试:
这是原图效果。为了方便,我拿我自己的logo来进行测试吧!
???你问我为啥看不清字?因为这个logo字体是白色的,头条这个文章背景也是白色的,所以看不清了。我把字体改成黑色的,方便大家先看一眼测试前的logo的样子。
然后进入激动人心的结果展示了!
为了方便大家查看效果,我还是觉得放在右下角比较合适:
可以看到,放在右下角的时候,logo红色轮廓和背景地面部分的颜色叠加了,导致红色轮廓变淡了,不清晰了。
效果不是很理想,在一些颜色对比差异比较大的logo和背景图时,这个效果直接变得非常差,甚至logo本身的颜色都会直接改变了。
我尝试了各种方法调整,都无济于事。这次算是翻车了。
又尝试找了解决方案,其中有个人的思路引起了我的注意,他提到,通过掩膜法处理这个问题的效果会比较好。但是由于我也不是做opencv方向的,不是特别懂,等后面有时间我再学习尝试一下。
使用PIL处理图像添加水印效果很好
上面的方案算是失败了。在处理图像方面,除了PS这种专业性软件之外,一些简单和稍微复杂点的图像变换操作,我一直都是使用ImageMagick和GraphicsMagick这两个软件,比如一些常见的图片放大缩小,格式转换,添加文字等等。
然后我本想着GraphicsMagick有没有python对应的处理库PythonMagick和pgmagick,但是要在系统上额外安装各种库,而且本身GraphicsMagick也是需要安装的。
然后我就发现了PIL这个图像处理库,与GraphicsMagick很相似,不过更方便,不需要额外安装什么工具,这一个类库就够了。而且已经是Python平台事实上的图像处理标准库了。
首先导入这个类库:
from PIL import Image接下来打开图片和logo,获取对应宽和高:
# 背景图像
img = Image.open(src_img)
# logo图像(需要保证像素大小要比src_img要小)
logo = Image.open(logo_img)
# 获取背景图宽和高
(W, H) = img.size
(w, h) = logo.size如果要对logo的大小进行调整的话,建议使用thumbnail这个函数,它是等比例放大和缩小,resize函数虽然也是放大缩小,但是如果没有设置好比例,会存在拉伸的情况。
scale = 0.3
logo.thumbnail(size=map(math.floor, (w * scale, h * scale)), resample=Image.ANTIALIAS)注意后面resample=Image.ANTIALIAS这个参数,它是指定了放大缩小按照最高质量进行,不至于处理后图片变模糊。
然后同样的,根据原图创建一个相同大小的“蒙版”层,透明度为0:
layer = Image.new('RGBA', img.size, (255, 255, 255, 0))然后利用Image.paste(im, box=None, mask=None)这个函数把logo粘贴到这个蒙版层上。
top = H - h - 30
right = 52
layer.paste(logo_img, (W - w - right, top))然后将logo、透明蒙版、背景进行合成,也就是三个图层叠加在一起。
这里使用Image.composite(image1, image2, mask)这个函数:
- image1:要合成的第一张图
- image2:要合成的背景图
- mask:使用mask图像作为透明度,将image1合成到image2上
result = Image.composite(layer, src_img, layer)得到的这个图,就是带了logo的和背景图一样大小的一个图层了。
后来我发现,Image.composite函数实际上还是调用的Image.paste函数,好像不用这么麻烦的创建蒙版层。
不需要layer,直接这样就好:
pos = (W - w - right, top)
src_img.paste(logo_img, pos, logo_img)但是这种情况仅限于logo_img是透明图像的时候,如果是非透明的是不可以的。所以前面使用layer的方式最稳妥。
好了,最后一步,保存图像:
result.save(dst_img, dst_format, quality=100)quality参数指定保存的质量是最高,最清晰的。1-100的数字,越低越模糊。
最终处理结果看图:
可以看到,logo非常清晰,也没有因为背景的颜色而混合。这种方式反而更简单、方便,而且效果更好一些,opencv还是更适合一些深入的处理吧。
总结
PIL是一个非常强大的图像处理库,现在已经是python的标准图像处理库了,不依赖额外外部的库和工具。对一些图片效果处理、合成、放大缩小、转换格式、添加水印这些操作简直如鱼得水,和GraphicsMagick有的一拼。
有时候工具过于强大,反而不是什么好事儿,因为会增加使用的复杂性和学习成本。简单点的工具,用起来可能会更得心应手!
我是大师兄,一枚计算机专业研究僧,如果你有什么疑问,或者有什么观点,都可以在评论区发表看法,或者私信我。大家一起共同探讨。
如果你也和我一样,热衷于技术,热衷于科技、互联网,不妨点个关注吧,我会持续分享干货知识、经验和观点总结。
相关推荐
- 安全教育登录入口平台(安全教育登录入口平台官网)
-
122交通安全教育怎么登录:122交通网的注册方法是首先登录网址http://www.122.cn/,接着打开网页后,点击右上角的“个人登录”;其次进入邮箱注册,然后进入到注册页面,输入相关信息即可完...
- 大鱼吃小鱼经典版(大鱼吃小鱼经典版(经典版)官方版)
-
大鱼吃小鱼小鱼吃虾是于谦跟郭麒麟的《我的棒儿呢?》郭德纲说于思洋郭麒麟作诗的相声,最后郭麒麟做了一首,师傅躺在师母身上大鱼吃小鱼小鱼吃虾虾吃水水落石出师傅压师娘师娘压床床压地地动山摇。...
-
- 哪个软件可以免费pdf转ppt(免费的pdf转ppt软件哪个好)
-
要想将ppt免费转换为pdf的话,我们建议大家可以下一个那个wps,如果你是会员的话,可以注册为会员,这样的话,在wps里面的话,就可以免费将ppt呢转换为pdfpdf之后呢,我们就可以直接使用,不需要去直接不需要去另外保存,为什么格式转...
-
2026-02-04 09:03 off999
- 电信宽带测速官网入口(电信宽带测速官网入口app)
-
这个网站看看http://www.swok.cn/pcindex.jsp1.登录中国电信网上营业厅,宽带光纤,贴心服务,宽带测速2.下载第三方软件,如360等。进行在线测速进行宽带测速时,尽...
- 植物大战僵尸95版手机下载(植物大战僵尸95 版下载)
-
1可以在应用商店或者游戏平台上下载植物大战僵尸95版手机游戏。2下载教程:打开应用商店或者游戏平台,搜索“植物大战僵尸95版”,找到游戏后点击下载按钮,等待下载完成即可安装并开始游戏。3注意:确...
- 免费下载ppt成品的网站(ppt成品免费下载的网站有哪些)
-
1、Chuangkit(chuangkit.com)直达地址:chuangkit.com2、Woodo幻灯片(woodo.cn)直达链接:woodo.cn3、OfficePlus(officeplu...
- 2025世界杯赛程表(2025世界杯在哪个国家)
-
2022年卡塔尔世界杯赛程公布,全部比赛在卡塔尔境内8座球场举行,2022年,决赛阶段球队全部确定。揭幕战于当地时间11月20日19时进行,由东道主卡塔尔对阵厄瓜多尔,决赛于当地时间12月18日...
- 下载搜狐视频电视剧(搜狐电视剧下载安装)
-
搜狐视频APP下载好的视频想要导出到手机相册里方法如下1、打开手机搜狐视频软件,进入搜狐视频后我们点击右上角的“查找”,找到自已喜欢的视频。2、在“浏览器页面搜索”窗口中,输入要下载的视频的名称,然后...
- 永久免费听歌网站(丫丫音乐网)
-
可以到《我爱音乐网》《好听音乐网》《一听音乐网》《YYMP3音乐网》还可以到《九天音乐网》永久免费听歌软件有酷狗音乐和天猫精灵,以前要跳舞经常要下载舞曲,我从QQ上找不到舞曲下载就从酷狗音乐上找,大多...
- 音乐格式转换mp3软件(音乐格式转换器免费版)
-
有两种方法:方法一在手机上操作:1、进入手机中的文件管理。2、在其中选择“音乐”,将显示出手机中的全部音乐。3、点击“全选”,选中所有音乐文件。4、点击屏幕右下方的省略号图标,在弹出菜单中选择“...
- 电子书txt下载(免费的最全的小说阅读器)
-
1.Z-library里面收录了近千万本电子书籍,需求量大。2.苦瓜书盘没有广告,不需要账号注册,使用起来非常简单,直接搜索预览下载即可。3.鸠摩搜书整体风格简洁清晰,书籍资源丰富。4.亚马逊图书书籍...
- 最好免费观看高清电影(播放免费的最好看的电影)
-
在目前的网上选择中,IMDb(互联网电影数据库)被认为是最全的电影网站之一。这个网站提供了各种类型的电影和电视节目的海量信息,包括剧情介绍、演员表、评价、评论等。其还提供了有关电影制作背后的详细信息,...
- 孤单枪手2简体中文版(孤单枪手2简体中文版官方下载)
-
要将《孤胆枪手2》游戏的征兵秘籍切换为中文,您可以按照以下步骤进行操作:首先,打开游戏设置选项,通常可以在游戏主菜单或游戏内部找到。然后,寻找语言选项或界面选项,点击进入。在语言选项中,选择中文作为游...
欢迎 你 发表评论:
- 一周热门
- 最近发表
- 标签列表
-
- python计时 (73)
- python安装路径 (56)
- python类型转换 (93)
- python进度条 (67)
- python吧 (67)
- python的for循环 (65)
- python格式化字符串 (61)
- python静态方法 (57)
- python列表切片 (59)
- python面向对象编程 (60)
- python 代码加密 (65)
- python串口编程 (77)
- python封装 (57)
- python写入txt (66)
- python读取文件夹下所有文件 (59)
- python操作mysql数据库 (66)
- python获取列表的长度 (64)
- python接口 (63)
- python调用函数 (57)
- python多态 (60)
- python匿名函数 (59)
- python打印九九乘法表 (65)
- python赋值 (62)
- python异常 (69)
- python元祖 (57)
