1、Pillow(PIL)的安装及常用操作
参数文档:Python Pillow(PIL)安装及Image 类的使用
2、 ImageDraw
ImageDraw 可以绘制各种几何图形的绘制和文本,如直线、椭圆、弧、弦、多边形以及文字等。Coordinates是绘图接口使用和PIL一样的坐标系统,即(0,0)为左上角。Colours是为了指定颜色,用户可以使用数字或者元组,对应用户使用函数Image.new或者Image.putpixel。对于模式为“1”,“L”和“I”的图像,使用整数。对于“RGB”图像,使用整数组成的3元组。对于“F”图像,使用整数或者浮点数。Colours Names在PIL 1.1.4及其以后的版本,用户绘制“RGB”图像时,可以使用字符串常量。Fonts是PIL可以使用bitmap字体或者OpenType/TrueType字体。
1)draw.arc(xy, start, end, fill=None, width=0)
在给定的区域内,在开始和结束角度之间绘制一条弧。
参数:
xy:变量xy是需要设置一个区域,此处使用4元组,包含了区域的左上角和右下角两个点的坐标。
start:起始角度,以度为单位。角度从3点开始测量,顺时针方向增加。
end:终止角度,以度为单位。
fill:用于弧线的颜色。
width:线宽,以像素为单位。
from PIL import Image, ImageDraw img = Image.open(r"D:\cjavapy.jpg") draw = ImageDraw.Draw(img) draw.arc((0,0,200,200),0,90,fill = 222)#圆 draw.arc((200,200,400,500),0,-90,fill = 222)#椭圆 draw.arc((200,200,300,300),-90,0,fill = 222)#圆 img.show()
2)draw.bitmap(xy, bitmap, fill=None)
在给定位置绘制bitmap (mask) ,对非零部分使用当前填充颜色。bitmap应该是有效的透明mask(模式“1”)或matte(模式“L”或“RGBA”)。
参数:
xy:变量bitmap对应位图起始的坐标值,不是一个区域。
bitmap:bitmap是一个有效的透明模板(模式为“1”)或者蒙版(模式为“L”或者“RGBA”)。
fill:非零部分使用fill的值来填充。
from PIL import Image, ImageDraw im1 = Image.open(r"D:\cjavapy.jpg") im2 = Image.open(r"D:\python.jpg") im = im2.resize((80,100),Image.ANTIALIAS) print(im.size) r,g,b = im.split() draw = ImageDraw.Draw(im1) draw.bitmap((0,0),r,fill=111) draw.bitmap((80,100),g,fill=(0,255,0)) draw.bitmap((160,200),b,fill=(0,0,255)) im1.show()
3)draw.chord(xy, start, end, fill=None, outline=None, width=1)
与arc()相同,但用一条直线连接端点。
参数:
xy:用两点来定义边界框。[(x0, y0), (x1, y1)]
或[x0, y0, x1, y1]的
序列,其中x1 >= x0
和y1 >= y0
。
start:起始角度,以度为单位。角度从3点开始测量,顺时针方向增加。
end:终止角度,以度为单位。
fill:用于填充的颜色。
outline:用于轮廓的颜色。
width:线宽,以像素为单位。
from PIL import Image, ImageDraw img = Image.open(r"D:\cjavapy.jpg") draw = ImageDraw.Draw(img) draw.chord((0,0,200,200),0,90,fill=128,outline=222) img.show()
4)draw.ellipse(xy, fill=None, outline=None, width=1)
在给定的包围框内绘制一个椭圆。
参数:
xy:用两点来定义边界框。[(x0, y0),(x1, y1)]
或[x0, y0, x1, y1]
的序列,其中x1 >= x0
和y1 >= y0
。
fill:用于填充的颜色。
outline:用于轮廓的颜色。
width:线宽,以像素为单位。
from PIL import Image, ImageDraw img = Image.open(r"D:\cjavapy.jpg") draw = ImageDraw.Draw(img) draw.ellipse((0,0,200,200),fill=123) draw.ellipse((200,200,300,400),fill=123) img.show()
5)draw.line(xy, fill=None, width=0, joint=None)
在xy列表中的坐标之间绘制一条线。
参数:
xy:2元组序列,如[(x, y), (x, y),…]
或数值,如[x, y, x, y,…]
。
fill:线条的颜色。
width:线宽,以像素为单位。
from PIL import Image, ImageDraw img = Image.open(r"D:\cjavapy.jpg") draw = ImageDraw.Draw(img) draw.line([(0,0),(100,50),(50,100)],fill=123,width=3) draw.line([0,20,50,90,100,300,200,80],fill=222,width=10) img.show()
6)draw.pieslice(xy, start, end, fill=None, outline=None, width=1)
与圆弧相同,但也在边界框的端点和中心之间绘制直线。
参数:
xy:用两点来定义边界框。[(x0, y0), (x1, y1)]
或[x0, y0, x1, y1]
的序列,其中x1 >= x0
和y1 >= y0
。
start:起始角度,单位是角度。角度从3点钟开始测量,顺时针增加。
end:结束角,单位是度数。
fill:用于填充的颜色。
outline:用于轮廓的颜色。
width:线宽,以像素为单位。
from PIL import Image, ImageDraw img = Image.open(r"D:\cjavapy.jpg") draw = ImageDraw.Draw(img) draw.pieslice((0,0,200,200),0,90,fill = 222)#扇形 draw.pieslice((200,200,400,500),0,-90,fill = 222)#椭圆扇形 draw.pieslice((200,200,300,300),-90,0,fill = 222)#圆扇形 img.show()
7)draw.point(xy, fill=None)
在给定的坐标上绘制点(单个像素)。
参数:
xy:2元组序列,如[(x, y), (x, y),…]
或数值,如[x, y, x, y,…]
。
fill:点的颜色。
from PIL import Image, ImageDraw img = Image.open(r"D:\cjavapy.jpg") draw = ImageDraw.Draw(img) draw.point((100,100),fill=123) draw.point((101,101),fill=(0,0,0)) img.show()
8)draw.polygon(xy, fill=None, outline=None, width=1)
绘制一个多边形。多边形轮廓由给定坐标之间的直线组成,加上最后一个坐标和第一个坐标之间的直线。
参数:
xy:2元组序列,如[(x, y),(x, y),…]
或数值,如[x, y, x, y,…]
。
fill:用于填充的颜色。
outline:用于轮廓的颜色。
width:线宽,以像素为单位。
from PIL import Image, ImageDraw img = Image.open(r"D:\cjavapy.jpg") draw = ImageDraw.Draw(img) draw.polygon([(0,0),(100,50),(50,100)],fill=123) draw.polygon([0,20,50,90,100,300,200,80],fill=222) img.show()
9)draw.rectangle(xy, fill=None, outline=None, width=1)
绘制一个矩形。
参数:
xy:用两点来定义边界框。[(x0, y0), (x1, y1)]
或[x0, y0, x1, y1]
的序列。边界框包含两个端点。
outline:用于轮廓的颜色。
fill:用于填充的颜色。
width:线宽,以像素为单位。
from PIL import Image, ImageDraw img = Image.open(r"D:\cjavapy.jpg") draw = ImageDraw.Draw(img) draw.rectangle([(0,0),(100,120)],fill=123) draw.rectangle((120,130,200,180),fill=222) draw.rectangle([200,200,300,400],fill=150) img.show()
10)draw.text(xy, text, fill=None, font=None, anchor=None, spacing=4, align='left', direction=None, features=None, language=None, stroke_width=0, stroke_fill=None, embedded_color=False)
在给定位置绘制字符串。
参数:
xy:文本的锚定坐标。
text :要绘制的字符串。如果它包含任何换行符,文本将被传递给multiline_text()。
fill:用于文本的颜色。
font:一个ImageFont实例。
anchor:文本锚定对齐。确定锚点与文本的相对位置。默认对齐方式是左上角。对于非truetype字体,该参数将被忽略。该参数在Pillow的早期版本中存在,但仅在8.0.0版本中实现。
spacing:如果将文本传给multiline_text(),则为行与行之间的像素数。
align:如果文本被传递给multiline_text(), "left", "center"或"right"。确定线的相对对齐。使用anchor参数指定指向xy的对齐方式。
direction:文本的方向。它可以是“rtl”(从右到左),“ltr”(从左到右)或“ttb”(从上到下)。需要libraqm。
features:在文本布局过程中使用的OpenType字体功能的列表。这通常用于打开默认情况下未启用的可选字体功能,例如"dlig"或"ss01",但也可用于关闭默认字体功能,例如"-liga"禁用连字,或"-kern"禁用字距。要获得所有受支持的特性。需要libraqm。
language:文本的语言。不同的语言可能使用不同的字形或连缀。这个参数告诉字体文本是哪种语言,并在适当的情况下应用正确的替换(如果可用的话)。它应该是BCP 47语言代码。需要libraqm。
stroke_width:文本笔画的宽度。
stroke_fill:用于文本描边的颜色。如果没有给出,将默认为填充参数。
embedded_color:是否使用字体嵌入的彩色符号(COLR、CBDT、SBIX)。
from PIL import Image, ImageDraw img = Image.open('/data/cjavapy.jpg') draw = ImageDraw.Draw(img) draw.text((im.size[1]-100,100),'haha',fill=(255,0,0),font=ImageFont.truetype('/data/fonts/image.ttf')) draw.text((100,100),'lalala',font=ImageFont.truetype('Arial/Arial.ttf',46)) img.show()
11)draw.textsize(text, font=None, spacing=4, direction=None, features=None, language=None, stroke_width=0)
9.2.0版后已移除。
使用textlength()
以1/64
像素精度测量以下文本的偏移量。使用textbbox()
来获得基于锚的精确边界框。
返回给定字符串的大小,单位为像素。
from PIL import Image, ImageDraw img = Image.open(r"D:\cjavapy.jpg") draw = ImageDraw.Draw(img) print(draw.textsize('text')) print(draw.textsize('cjavapy‘))
相关文档:
Python Pillow(PIL) 图像处理(分离、合并、裁剪、几何变换)
Python Pillow(PIL) ImageFont的使用