本文介绍如何使用Python给图像添加水印(文本或图片)。前面,我们已经学习了:这里需要使用Pillow库(Python
Imaging Library),使用pip命令安装:向图像中添加水印,基本上是将一张图像(水印)放置在另一张图像的顶部。能够控制logo图像的透明度将有助于使最终生成的图像看起来更好。因此,最好使用支持图像透明度的PNG文件格式的水印图像。如果水印文件是JPG/JPEG格式,不要担心。我们也不会使用一些转换器将JPG转换为PNG。Python可以为图像添加所需的“透明度”。虽然PNG文件和JPG文件之间有一些不同,但我们主要关注的是图像的透明度特征。图像透明度基本上是指图像是否可以透过。让我们将两个图像文件加载到Python中。这是相同的图像,但格式不同,一个是PNG,另一个是JPG。让我们看看这两个图像文件之间的差异。对于计算机来说,图像文件基本上是一组数字。将这两个图像文件加载到NumPy数组将有助于可视化这个概念。示例PNG和JPG图像的大小均为1100
x 1100像素。然而,shape属性中的最后一个数字不同:JPG是3,而PNG是4。让我们显示numpy数组以查看差异。每个数组内的值表示每个像素的颜色。例如,在PNG文件中,[255,255,255,255]表示白色但完全不透明。而在JPG文件中,[255,255,255]表示白色的像素。前三个整数值(如上图2左侧所示)是RGB(红色、绿色和蓝色)值,PNG数组中的第四个整数称为“alpha通道”,它控制透明度(因此命名为“RGBA”)。如上图2所示,PNG支持透明度(即alpha通道),但JPG没有。1.RGB的值为255表示每种颜色的最大值。将所有三个值设为最大值(255,255,255)基本上是白色。2.alpha通道的值为255表示不透明;而alpha值为0表示完全透明。Pillow库使JPG文件转换为PNG格式变得非常容易。我们可以使用putalpha()方法将alpha通道(即第四个整数)添加到JPG图像。注意,参数内部的范围可以是0到255。值为0表示完全透明,即我们不会看到任何东西;255表示不透明。这里选择了数值180,这样我们的水印图像将有点半透明。这张图片还有一个问题——它的背景是白色的。通常,PNG文件的背景是“透明的”。我们可以通过将图像上所有白色像素的alpha通道设置为0(透明)来“删除”白色背景。换句话说,对于每个RGB值为[255,255,255,180]的像素,我们将alpha通道设置为0,以使像素完全透明。由于我们已经将图像的RGBA值放入Numpy数组中,因此操纵颜色很容易。为了找到所有白色的像素,可以创建一个掩码,其中白色像素=True,否则为False。下面的代码检查图像的每个像素的所有R、G和B值是否等于255。注意,transparent_watermark[:,:,0]仅返回所有1100×1100像素的第一个元素(即“R”的整数值)的数组。然后,我们为满足标准的像素赋新值[255,255,255,0]。这一步有效地将所有白色像素变为完全透明。可以使用PIL库的Image.fromarray()方法将NumPy数组转换回图像文件。watermark_final
= Image.fromarray(transparent_watermark)现在,我们已经完成了准备Logo图像,是时候将其作为水印添加到基础图像中了。我们首先将水印图像的大小调整为基础图像的1/5,当然也可以使用另一种适合你需要的大小。然后,将创建一个与基础图像大小相同的空“画布”,并将此画布设置为处处透明。transparent
= Image.new(mode='RGBA',size = (width,height), color=0)设置画布后,将1)粘贴基础图像,2)将水印图像粘贴在基础图像的顶部。如下所示,Image.paste()方法有三个参数:2.box–粘贴图像的起点(左上角)的(x,y)坐标3.mask-遮罩/过滤器,有助于从粘贴的图像中去除所有透明像素wm_position
= (int(3/4*width), int(3/4 * height))transparent.paste(im=watermark_final,
box=wm_position, mask=watermark_final)现在,已经成功地将一张JPG格式的水印添加到另一张图片上,如下图7所示。注:本文学习整理自pythoninoffice.com,供有兴趣的朋友学习参考。
|