该ImageDraw
模块为Image
对象提供简单的2D图形 。可以使用此模块创建新图像,注释或润饰现有图像,以及动态生成图形以供Web使用。
概念
坐标
图形界面使用与PIL本身相同的坐标系,左上角有(0,0)。在图像边界之外绘制的任何像素都将被丢弃。
颜色
要指定颜色,你可以使用数字或元组就像你在使用 PIL.Image.new()
或PIL.Image.Image.putpixel()
。对于“1”,“L”和“I”图像,请使用整数。对于“RGB”图像,请使用包含整数值的3元组。对于“F”图像,请使用整数或浮点值。
对于调色板图像(模式“P”),使用整数作为颜色索引。只要不绘制超过256种颜色,绘图图层就会自动指定颜色索引。
颜色名称
ImageColor模块支持以下字符串格式:
- 十六进制颜色说明符,以
#rgb
或表示#rrggbb
。例如,#ff0000
指定纯红色。 - RGB函数,给定颜色值
rgb(red, green, blue)
在0到255范围内的整数。或者,颜色值可以给出三个百分比(0%到100%)。例如,rgb(255,0,0)
和rgb(100%,0%,0%)
都规定纯净的红色。 - 色调 - 饱和度 - 亮度(HSL)函数,给定
hsl(hue, saturation%, lightness%)
为色调为0到360之间的角度给出的颜色(红色= 0,绿色= 120,蓝色= 240),饱和度为0%到100%之间的值(灰色= 0%,全色= 100%),亮度是0%和100%之间的值(黑色= 0%,正常= 50%,白色= 100%)。例如,hsl(0,100%,50%)
是纯红色。 - 色调饱和度值(HSV)函数,
hsv(hue, saturation%, value%)
其中色调和饱和度与HSL相同,值在0%和100%之间(黑色= 0%,正常= 100%)。例如,hsv(0,100%,100%)
是纯红色。这种格式也称为色调饱和度 - 亮度(HSB),并且可以给出hsb(hue, saturation%, brightness%)
,其中每个值都用在HSV中。 - 常见的HTML颜色名称。该
ImageColor
模块根据X Window系统和大多数Web浏览器支持的颜色提供大约140种标准颜色名称。颜色名称不区分大小写。例如,red
和Red
都规定纯净的红色。
字体
PIL可以使用位图字体或OpenType / TrueType字体。
位图字体以PIL自己的格式存储,其中每种字体通常由两个文件组成,一个名为.pil,另一个通常名为.pbm。前者包含字体度量,后者包含栅格数据。
要加载位图字体,请使用ImageFont
模块中的加载函数。
要加载OpenType / TrueType字体,请使用ImageFont
模块中的truetype函数 。请注意,此函数依赖于第三方库,并且可能并非在所有PIL构建中都可用。
功能
ImageDraw.Draw(im, mode=None)
创建可用于在给定图像中绘制的对象.
- im - 要绘制的图像。
- mode - 用于颜色值的可选模式。对于RGB图像,此参数可以是RGB或RGBA(将图形混合到图像中)。对于所有其他模式,此参数必须与图像模式相同。如果省略,则模式默认为图像模式。
d = ImageDraw.Draw(im)
ImageDraw.arc(xy, start, end, fill=None, width=0)
在给定的边界框内,在起始角度和结束角度之间绘制圆弧(圆形轮廓的一部分)。
- xy -两个点来定义边界框。顺序
[(x0, y0), (x1, y1)]
或[x0, y0, x1, y1]
- start - 起始角度,以度为单位。角度从3点开始测量,顺时针增加。
- end - 结束角度,以度为单位。
- fill - 用于弧的颜色。
- width -线宽,以像素为单位。
im = Image.open('IMG3.jpg')
draw = ImageDraw.Draw(im)
draw.arc((300,400,400,500),0,90,fill='blue', width=12)
im.show()
ImageDraw.bitmap(xy, bitmap, fill = None)
使用非零部分的当前填充颜色在给定位置绘制位图(蒙版)。位图应该是有效的透明度掩码(模式“1”)或遮罩(模式“L”或“RGBA”)。
这个方法与Image.paste(xy, color, bitmap)有相同的功能。
r, g, b = im.split()
draw.bitmap((100,200),g,fill=(0,200,100))
ImageDraw.chord(xy, start, end, fill=None, outline = None, width = 0)
画一个内部颜色填充和有轮廓的圆的一部分。
- xy -两个点来定义边界框。顺序
[(x0, y0), (x1, y1)]
或[x0, y0, x1, y1]
- outline - 用于轮廓的颜色。
- fill - 用于填充的颜色。
- 宽度 -线宽,以像素为单位。
draw.chord((100,200,300,400),0,230,fill=(0,200,100),outline=(200,100,29),width=6)
ImageDraw.ellipse(xy, fill=None, outline = None, width = 0)
在给定的边界框内绘制一个椭圆。
draw.chord((100,200,300,400),0,230,fill=(0,200,100),outline=(200,100,29),width=6)
ImageDraw.line(xy,fill=None, width=0, joint=None)
在xy列表中的坐标之间绘制一条线。
- xy - 2元组的序列
[(x, y), (x, y), ...]
或[x, y, x, y, ...]
类似的数值。 - fill - 用于线条的颜色。
- 宽度 -线宽,以像素为单位。
- 联合 -一系列线之间的联合类型。它可以是“曲线”,对于圆边,或无。
draw.line([(100,200),(400,400),(20,300)],fill=(0,200,100),width=6)
ImageDraw.pieslice(xy, start, end, fill=None, outline = None, width = 0)
与弧相同,但也在端点和边界框的中心之间绘制直线。
draw.pieslice([(100,100),(400,400)],0,150,fill='blue',outline='red',width=5)
ImageDraw.point(xy, fill=None)
在给定坐标处绘制点(单个像素)。
- xy - 2元组的序列
[(x, y), (x, y), ...]
或[x, y, x, y, ...]
类似的数值。 - fill - 用于点的颜色。
draw.point([x, x+3],fill='black')
ImageDraw.polygon(xy, fill=None, outline=None)
绘制一个多边形。多边形轮廓由给定坐标之间的直线加上最后一个坐标和第一个坐标之间的直线组成。
xy - 2元组的序列[(x, y), (x, y), ...]
或[x, y, x, y, ...]
类似的数值。
draw.polygon([(100,200),(400,400),(20,310)], fill='blue', outline='purple')
ImageDraw.rectangle(xy, fill=None, outline = None, width = 0)
绘制一个矩形。
- xy - 定义边界框的两个点。任何一个
[(x0, y0), (x1, y1)]
或[x0, y0, x1, y1]
的序列 。第二点就在绘制的矩形之外。
draw.rectangle([(100,200),(400,400)], fill='blue', outline='purple',width=5)
ImageDraw.text(xy,text,fill = None,font = None,anchor = None,spacing = 0,align =“left”,direction = None,features = None,language = None)
在给定位置绘制字符串。
- xy - 文本的左上角。
- text - 要绘制的文本。如果它包含任何换行符,则将文本传递给multiline_text()
- fill - 用于文本的颜色。
- font - 一个
ImageFont
实例。 - spacing - 如果文本传递给multiline_text(),则为行之间的像素数。
- align - 如果文本传递给multiline_text(),“left”,“center”或“right”。
- direction -文字的方向。它可以是'rtl'(从右到左),'ltr'(从左到右)或'ttb'(从上到下)。需要libraqm。
- features -在文本布局期间使用的OpenType字体功能列表。这通常用于打开默认情况下未启用的可选字体功能,例如'dlig'或'ss01',但也可用于关闭默认字体功能,例如'-liga'以禁用连字或' - kern'禁用字距调整。要获得所有支持的功能,请参阅https://docs.microsoft.com/en-us/typography/opentype/spec/featurelist 需要libraqm。
- language -文字的语言。不同的语言可能使用不同的字形或连字。此参数告诉字体文本所使用的语言,并根据需要应用正确的替换(如果可用)。它应该是BCP 47语言代码,需要libraqm。
ft = ImageFont.truetype('Brush Script.ttf', 37)
draw.text((303,330), 'yelling', fill='pink', font=ft)
ImageDraw.multiline_text(xy,text,fill = None,font = None,anchor = None,spacing = 0,align =“left”,direction = None,features = None,language = None)
在给定位置绘制字符串。
ft = ImageFont.truetype('Songti.ttc', 37) # mac里的宋体文件名称
draw.multiline_text((303,330), '富强民主\n 文明和谐自由', fill='pink', font=ft, spacing=20, align='right')