Python实现图片批量加入水印代码实例
这篇文章主要介绍了Python实现图片批量加入水印代码实例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
写文章的时候可以设置是否添加水印。可是,有些图片可能想加水印,有些不想加水印,该怎么办呢?
配置环境
python3+pillow
pip3installpillow
引入库
fromPILimportImage,ImageSequence importos importrandom
效果预览:
使用方法:
- 在脚本同目录下添加水印图片logo.png
- 创建目录input并在放入要添加水印的图片
- 创建目录output执行脚本addlogo.py
- 结果输出在output文件夹下
实现原理
水印图片采集:
先读取水印图片的像素点信息和大小信息。去除透明度为0的像素,并修改透明度像素信息。
img_logo=Image.open("logo.png") img_logo_width,img_logo_height=img_logo.size img_logo_pixels=dict() forwinrange(img_logo_width): forhinrange(img_logo_height): c=img_logo.getpixel((w,h)) ifc!=(0,0,0,0): img_logo_pixels[(w,h)]=c[:3]+(125,)
混合颜色:
对每一个像素点采取颜色混合,其中c1是源图片的像素点信息(r,g,b,a),c2是logo图片像素点的信息。混合算法如下:
defblendPixel(c1,c2): a1=256-c2[3] a2=c2[3]-(a1*c2[3])/256.0 a=a1+a2 c=(int((a1*c1[0]+a2*c2[0])/a),int((a1*c1[1]+a2*c2[1])/a),int((a1*c1[2]+a2*c2[2])/a),int(a)) returnc
处理源Image对象:
随机一个位置开始处理像素,具体代码参考如下。
defdealOneImage(image,offX=None,offY=None): w,h=image.size offX=offXifoffXelserandom.random(); offY=offYifoffYelserandom.random(); #如果图片尺寸小于水印图片,不加水印 ifw>=img_logo_widthandh>=img_logo_height: top=int((w-img_logo_width)*offX) left=int((h-img_logo_height)*offY) forp,cinimg_logo_pixels.items(): p_x=(p[0]+top) p_y=(p[1]+left) image_c=image.getpixel((p_x,p_y)) if(isinstance(image_c,tuple)andlen(image_c)>2): image.putpixel((p_x,p_y),blendPixel(image_c,c)) returnimage;
处理单个文件:
对于gif文件先拆成一张一张图片,在图片上添加水印,最后再合成gif。对于其他格式的图片文件可以多添加几个水印。最后输出保存到output文件夹下。
defdealOneFile(filePath): img_orign=Image.open(filePath) _,file_type=os.path.splitext(filePath) basename=os.path.basename(filePath) iffile_type=='.gif': sequence=[]; offX=random.random() offY=random.random() forfinImageSequence.Iterator(img_orign): iflen(sequence)%2==0: offX=random.random() offY=random.random() sequence.append(dealOneImage(f.convert(),offX,offY)) sequence[0].save(f'./output/{basename}',save_all=True,append_images=sequence[1:]) else: image_out=(dealOneImage(img_orign)) forxinrange(1): image_out=(dealOneImage(image_out)) image_out.save(f'./output/{basename}')
处理目录:
对当前目录下的文件做一个筛选,只选取图片格式的文件。
defdealSrc(srcDir): picFiles=[os.path.join(srcDir,fn)forfninos.listdir(srcDir)iffn.endswith(('.gif','.jpg','.png','.jpeg'))] forfilePathinpicFiles: dealOneFile(filePath)
小结
添加水印主要用了python3中的pillow库来实现。首先是读取logo图片信息,接着在随机一个位置添加混合后的像素点信息,最后再保存起来。
其中,对于gif文件的处理是拆帧,再添加水印,最后再组合成一个gif。这个只能对应比较小的gif文件处理,如果有更好的方法欢迎留言交流分享!
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持毛票票。
声明:本文内容来源于网络,版权归原作者所有,内容由互联网用户自发贡献自行上传,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任。如果您发现有涉嫌版权的内容,欢迎发送邮件至:czq8825#qq.com(发邮件时,请将#更换为@)进行举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。