当前位置: 首页 > 后端技术 > Python

Python实现批量给图片加水印!从枕头开始!

时间:2023-03-26 17:20:50 Python

写文章时,可以设置是否加水印。但是有的图片可能要加水印,有的图片可能不加水印,怎么办?配置环境python3+pillowpip3installpillowimportlibraryfromPILimportImage,ImageSequenceimportosimportrandom效果预览:使用方法:在脚本同目录下添加水印图片logo.png创建目录input,将要加水印的图片放到创建目录输出执行脚本addlogo.py结果输出到输出文件夹实现水印图片采集原理:首先读取水印图片的像素信息和尺寸信息。去除透明度为0的像素,修改透明度像素信息。img_logo=Image.open("logo.png")img_logo_width,img_logo_height=img_logo.sizeimg_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.0a=a1+a2c=(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.sizeoffX=offXifoffXelserandom.random();offY=offY如果offYelserandom.random();#如果图片尺寸小于Watermark图片,没有水印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))返回图像;处理单个文件:对于一个gif文件,将其一张一张拆分成图片,给图片加水印,最后合成一个gif。对于其他格式的图像文件,可以添加多个水印。最终输出保存到输出文件夹。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()序列.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文件进行处理。如果有更好的方法欢迎留言交流分享!本文仅供个人学习交流,请勿用于其他用途!参考