python给图片加水印很简单!你选Opencv还是PIL?
off999 2024-10-29 14:56 39 浏览 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有的一拼。
有时候工具过于强大,反而不是什么好事儿,因为会增加使用的复杂性和学习成本。简单点的工具,用起来可能会更得心应手!
我是大师兄,一枚计算机专业研究僧,如果你有什么疑问,或者有什么观点,都可以在评论区发表看法,或者私信我。大家一起共同探讨。
如果你也和我一样,热衷于技术,热衷于科技、互联网,不妨点个关注吧,我会持续分享干货知识、经验和观点总结。
相关推荐
- nba免费直播高清jrs免(nba直播在线观看高清jrs)
-
由于美国和中国之间贸易战的原因,和火箭总裁的出言不逊,导致中国和NBA的播放停止。所以不能观看,等到后期和解后可以继续观看!祝你好运!有高清的,看NBA还是挺好的。方法一:JRS直播1、JRS直播是一...
- pc游戏模拟器(pc游戏模拟器推荐)
-
目前,PC游戏模拟器中最受欢迎和认可的是著名的BlueStacks。它是一款免费的安卓模拟器,可以在电脑上运行各种安卓游戏和应用程序。BlueStacks具有卓越的性能和稳定性,提供了流畅的游戏体验,...
- 炉石传说手游官网下载(炉石传说手游官网下载国服)
-
要下载炉石传说端游,可前往该游戏的官方网站或Blizzard官网,从中下载安装程序并安装。同时,玩家也可在国内的一些游戏下载网站上下载该游戏的安装包,但需保证其来源可靠。另外,在下载安装游戏时,可根据...
- 中信建投证券手机版下载(中信建投证券手机版下载什么软件)
-
不好退。1.中信建投证券app是一种金融工具,下载使用后就是用于完成交易和管理投资的,因此一旦下载就意味着启动了使用过程,是不可以退掉的。2.一些软件商店对于使用了特定时间的软件才可以退款,但是中...
- cad破解版在哪里下载(cad破解版怎么下载怎么安装)
-
如果你下载软件的时候,有提示是敲诈的病毒,那么有可能是因为你在下载软件的时候,不是正规渠道下载的,所以你下载的软件会带有病毒,你可以去电脑管家里面找到你的杀毒软件,来对你下载的软件进行病毒的查杀,你也...
- 游戏厅所有老游戏大全(老版游戏厅)
-
这个答案太多了现在比较普遍的应该是:拳皇系列(97,98为主)三国战纪系列,合金弹头系列,飞机系列等等别名:暴风小子、街头风雨用MAME模拟器可以玩到KOF系列的啊,94、95、96、97、98、...
- 163免费邮箱入口(163免费邮箱入口官网)
-
手机163的登录入口163邮箱官网入口是;https://smart.mail.163.com/login.htm网易邮箱注册方法;1在浏览器搜索“网易邮箱”。2进入网易邮箱官网https://sma...
- 一笔签名设计免费版(设计自己的签名免费版)
-
我国法律没有规定签名时要求一笔一划的写,因此,怎么签名这是公民的自由,合同方式协商一致即可。 但是,在实践中,双方当事人签合同时,建议写工整,能让他人认识签名的是谁,另外,最好在名字上按个手印,...
- win10正式版下载官网(win10官网免费下载)
-
先看系统之家之类的系统盘网站提供的系统盘文件,都是Ghost系统盘。所有的Ghost系统盘都是网络上的电脑系统高手以Ghost系统映像文件为基础制作的系统安装盘,在必要的windows安装系统的基础...
- adobe indesign(adobe indesign 下载)
-
在InDesign中,您可以通过使用数据合并功能来快速导入全年日历。首先,您需要准备一个包含所有日期和相应格式的数据表格,然后在InDesign中创建一个日历模板。接下来,使用数据合并功能将数据表格与...
- qq32位版本下载官方(qq3.3.3版本下载)
-
1152活跃天。QQ等级升级需要的活跃天数和自然的日是完全不同的,活跃天并不等于自然天数。活跃天是需要满足加速条件后才能获得的,相当于某些业务的成长值,经验值等,QQ等级由四个标识图展示,从低到高分别...
- 最新版本qq手机版下载安装免费
-
你说的是下载QQ软件吗?现在手机应用市场里都有QQ软件下载的,或者直接百度也可以。不用。苹果手机在appstore里下载手机qq步骤如下:1.在苹果手机中打开自带的AppStore软件进入;2.按...
- 全国34个卫视频道(全国34个卫视频道节目单)
-
全国卫视频道不止34个。全国各地28大省级卫视:北京卫视·天津卫视·河北卫视·山西卫视·内蒙古卫视·辽宁卫视·吉林卫视·黑龙江卫视·江苏卫视·浙江卫视·安徽卫视·江西卫视·山东卫视·河南卫视·湖北卫视...
- 福昕pdf阅读器电脑版(福昕pdf阅读器电脑版怎么用)
-
这是因为你的pdf文件没有与福昕阅读器进行关联。你如果要想双击pdf文档后使用福昕阅读器打开,可以这样设置一下::选中pdf文档,右击鼠标,在快捷菜单中点击属性。点击“属性”对话框中“打开方式”右边的...
欢迎 你 发表评论:
- 一周热门
- 最近发表
- 标签列表
-
- 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)
