365Tools
发布时间:2024-03-06 09:30:01
为图片添加水印能够在一定程度上避免其他人滥用您的图片,这是保护图片版权的一种有效方式。因此,当您在微博、或者博客等一些公众平台分享图片的时候,建议您为自己的图片添加一个水印,来证明这张图片属于您。ImageDraw和ImageFont模块成功解决了上述问题。
draw = ImageDraw.Draw(im)上述方法会返回一个 ImageDraw 对象,参数 im 表示 Image 对象。这里我们可以把 Image 对象理解成画布,通过调用 ImageDraw 对象的一些方法,实现了在画布上绘制出新的图形目的。ImageDraw 对象的常用方法如下表所示:
| 方法 | 说明 |
|---|---|
| text | 在图像上绘制文字 |
| line | 绘制直线、线段 |
| eclipse | 绘制椭圆形 |
| rectangle | 绘制矩形 |
| polygon | 绘制多边形 |
表格中第一个方法 text() 需要与 ImageFont 模块一起使用,在下面会做详细介绍。
绘制矩形图的语法格式如下:draw.rectangle(xy, fill=None, outline=None)参数说明如下:
from PIL import Image,ImageDraw
#创建 Image 对象,当做背景图
im = Image.new('RGB',(200,200),color='gray')
#创建 ImageDraw 对象
draw = ImageDraw.Draw(im)
#以左上角为原点,绘制矩形。元组坐标序列表示矩形的位置、大小;fill设置填充色为红色,outline设置边框线为黑色
draw.rectangle((50,100,100,150),fill=(255,0,0),outline=(0,0,0))
#查看原图片
im.show()
#保存图片
im.save("C:/Users/Administrator/Desktop/添加矩形图.png")
图形显示结果如下:
font = ImageFont.truetype(font='字体文件路径', size=字体大小)如果想要在图片上添加文本,还需要使用 ImageDraw.text() 方法,语法格式如下:
d.text((x,y), "text", font, fill)参数说明如下:
from PIL import Image,ImageFont,ImageDraw
#打开图片,返回 Image对象
im = Image.open("C:/Users/Administrator/Desktop/c-net.png")
#创建画布对象
draw = ImageDraw.Draw(im)
#加载计算机本地字体文件
font=ImageFont.truetype('C:/Windows/Fonts/msyh.ttc',size=36)
#在原图像上添加文本
draw.text(xy=(80,50),text='365工具网',fill=(255,0,0),font=font)
im.show()
im.save("C:/Users/Administrator/Desktop/c.png")
图像显示结果如下:
ImageDraw和ImageFont模块有了大体的认识,并且也解决了如何给图片添加水印的两个关键问题。以下示例展示了为图片添加水印的详细过程,代码如下所示:
"""
添加水印(函数式编程)
"""
from PIL import Image,ImageFont,ImageDraw
font=ImageFont.truetype('C:/Windows/Fonts/msyh.ttc',size=30)
def creating_watermark(im,text,font=font):
#给水印添加透明度,因此需要转换图片的格式
im_rgba=im.convert('RGBA')
im_text_canvas=Image.new('RGBA',im_rgba.size,(255,255,255,0))
print(im_rgba.size[0])
draw = ImageDraw.Draw(im_text_canvas)
#设置文本文字大小
text_x_width,text_y_height = draw.textsize(text,font=font)
print(text_x_width,text_y_height)
text_xy = (im_rgba.size[0] - text_x_width, im_rgba.size[1] - text_y_height)
print(text_xy)
#设置文本颜色(绿色)和透明度(半透明)
draw.text(text_xy,text,font=font,fill=(255,255,255,128))
#将原图片与文字复合
im_text=Image.alpha_composite(im_rgba,im_text_canvas)
return im_text
image = Image.open("C:/Users/Administrator/Desktop/c-net.png")
image.show()
image_water = creating_watermark(image,'@c语言中文网')
image_water.show()
image_water.save("C:/Users/Administrator/Desktop/c语言中文网.png")
添加水印后的效果图: