水印
水印是一种常见的图片处理需求。当既需要展示,又需要保护知识产权时,就需要使用文字或者图片来打水印。下面的代码展示了文字水印与图片水印的过程。
--javascripttypescriptbashsqljsonhtmlcssccppjavarubypythongorustmarkdown
from pathlib import Pathfrom PIL import Image, ImageDraw, ImageFont, ImageGrabdef screenshot(box=None, outputfilename='screen.png'):"""屏幕截图Args:box (object, optional): 屏保的矩形位置outputfilename (str, optional): 要输出的文件"""if not box:# 全屏im = ImageGrab.grab()else:im = ImageGrab.grab(box)im.save(outputfilename)def genwatername(inputname):"""根据Args:inputname (string): 原始图片文件名Returns:string: 生成水印后的文件名"""p = Path(inputname)return Path.joinpath(p.parent, f'{p.stem}-water.png')def textwater(inputimage, text, rotatedegree=0):"""给图片加上文字truetype设置字体、文字大小stxingka.ttf华文行楷 simkai.ttf 楷体 simli.ttf 隶书Args:inputimage (string): 要加文字水印的图片text (string): 要加入的文字"""font = ImageFont.truetype("C:\\WINDOWS\\Fonts\\simkai.ttf", 100)# 生成一个一样大的文字图片img = Image.open(inputimage)img_txt = Image.new('RGBA', img.size, (0, 0, 0, 0))draw = ImageDraw.Draw(img_txt)draw.text((50, 200), (text), fill=(255, 255, 255, 255), font=font)img_txt = img_txt.rotate(rotatedegree)# 进行图片合成,两个图片必须具有相同的mode和sizeimg_wm = Image.alpha_composite(img.convert('RGBA'), img_txt)img_wm.save(genwatername(inputimage))def figwater(inputimage, maskimage):"""给图片加水印图片(例如公司的LOGO等)Args:inputimage (string): 原图maskimage (string): 水印图片"""img = Image.open(inputimage)# 加图片水印img_logo = Image.open(maskimage).reduce(8)img_mask = Image.new('RGBA', img.size, (0, 0, 0, 0))img_mask.paste(img_logo, (260, 80))img_wm = Image.alpha_composite(img.convert('RGBA'), img_mask)# 保存水印图片img_wm.save(genwatername(inputimage))targetfilename = r'd:\test\fullscreen.png'
screenshot(outputfilename=targetfilename)
textwater(targetfilename, '宁在一思进,莫在一思停')targetfilename = r'd:\test\11.jpeg'
figwater(targetfilename, r"D:\test\logo-full.png")
此时文字文印的效果如下图所示。
其中背景图是使用PIL截屏而来。在文字水印时,必须指定中文字体的位置。图片水印其实是2个图片的融合。在本例中要先准备好一张公司的logo图如下所示。
随后与目标图相融合,效果如下所示。
事实上,可以从本例出发,将公司的LOGO放在再小一些,旋转后复制多次,就可以形成更复杂的水印效果。水印与散列很类似,是一个单向的过程,水印极难去除,即使网上号称的去码神器其实效果真的一般,而且一些基于AI的也只是“合理”的猜想,不是真正的还原。