文章目录
- 一、绘图(ImageDraw模块)
- 二、字体和字型处理(ImageFont模块)
- 三、绘制十字案例
- 四、绘制验证码
一、绘图(ImageDraw模块)
"""
Python中的ImageDraw模块实现类绘图功能,主要为两方面:
1.创建图片的方式绘制2D图像
2.在原有的图片进行绘图,对图片进行修饰和注释
在使用ImageDraw模块绘图时需要创建一个ImageDraw.Draw对象,且提供指向文件的参数,引用创建的Draw对象方法进行绘图,最后保存或输出绘制图像
格式:对象名 = ImageDraw.Draw(参数)
功能函数:
1.绘制直线
格式:对象名.line([x1,y1,x2,y2],fill=None,width=0,joint=None)
[x1,y1,x2,y2]表示以(x1,y1)为起点,(x2,y2)为终点画一条直线,[x1,y1,x2,y2]也可以写作[(x1,y1),(x2,y2)]
fill用于设定指定的线条颜色
width用于设置线条的宽度
joint表示一系列线之间的联合类型,例如"曲线"
2.绘制圆弧
格式:对象名.arc([x1,y1,x2,y2],start,end,fill=None,width=0)
[x1,y1,x2,y2]表示在左上角坐标(x1,y1),右下角坐标(x2,y2)的矩形区域内,完整的圆O类,以start为起始角度,
end为终止角度,截取圆O的一部分圆弧并画出来,如果[x1,y1,x2,y2]区域不是正方形,则在该区域最大椭圆中根据角度调用圆弧
fill,width于line()方法相同
3.绘制椭圆
格式:对象名.ellipse([x1,y1,x2,y2],fill=None,outline=None,width=0)
用法同arc类似,用于画圆(或者椭圆),outline表示只规定圆的颜色
4.绘制弦
格式:对象名.chord([x1,y1,x2,y2],start,end,fill=None,outline=None,width=0)
用法同arc类似,用于画圆从start到end的弦,fill表示弦于圆弧之间空间用指定颜色填满,设置为outline表示只规定弦线的颜色
5.绘制扇形
格式:对象名.pieslice([x1,y1,x2,y2],start,end,fill=None,outline=None,width=0)
用法同ellipse类似,用于画起止角度间的扇形区域,fill表示将扇形区域用指定颜色填满,设置为outline表示只用指定颜色描出区域轮廓
6.绘制多边形
格式:对象名.polygon([x1,y1,x2,y2],fill=None,outline=None)
根据坐标画多边形,Python会根据第一个参量中的(x,y)对,连接整个图形,fill表示将多边形区域用指定颜色填充填满,outline用于描出区域轮廓。
7.绘制矩形
格式:对象名.rectangle([x1,y1,x2,y2],fill=None,outline=None,width=0)
在指定区域画一个矩形,(x1,y1)表示左上角的坐标,(x2,y2)表示矩形右下角的坐标,fill用于将矩形区域颜色填满,outline用于描出区域轮廓
8.绘制文字
格式:对象名.text(position,text,fill=None,font=None,anchor=None,spacing=0,align='left',direction=None,features=None,languag=None)
在图像内添加文字,其中参数position是一个二元组,用于指定文字左上角的坐标
text表示要写入的文字内容
fill表示文本的颜色
font必须为ImageFont中指定的font类型
spacing表示行之间的像素数
align表示位置left,center,right
direction表i示文字的方向,它可以是rtl(从右到左)、ltr(从左到右)或者ttb(从上到下)
9.绘制点
格式:对象名.point(xy,fill=None)
给定坐标处绘制点(单个像素)
"""
from PIL import Image,ImageDraw
img = Image.new('RGB',(100,100),'red')
imgdraw = ImageDraw.Draw(img)
imgdraw.line((10,10,50,50),fill='white',width=2)
img.show()
imgdraw.arc([10,10,50,50],0,90,fill='white',width=2)
img.show()
imgdraw.ellipse([10,10,50,50],fill='white',outline='yellow',width=2)
img.show()
imgdraw.chord([10,10,50,50],0,90,fill='white',outline='yellow',width=2)
img.show()
imgdraw.pieslice([10,10,50,50],0,90,fill='white',outline='yellow',width=2)
img.show()
imgdraw.polygon([10,50,60,30],fill='white',outline='yellow')
img.show()
imgdraw.rectangle([10,10,50,50],fill='white',outline='yellow',width=2)
img.show()
imgdraw.text((10,10),text='hello python',fill='white')
img.show()
imgdraw.point([10,10],fill='white')
img.show()
from PIL import Image,ImageDraw
img = Image.open('clock.png')
imagdraw = ImageDraw.Draw(img)
imagdraw.rectangle([10,10,50,50],fill='red')
img.show()
img.save("new.jpg")
二、字体和字型处理(ImageFont模块)
"""
ImageFont:实现对字体和字型的处理
内置函数:
1.load():从指定的文件加载一种字体,该函数返回对应的字体对象,如果失败,将产生IOError异常
格式:ImageFont.load(文件名)
2.load_path():和函数load_path()一样,但是如果没有指定当前路径,就会从文件sys.path开始查找指定文件
格式:ImageFont.load_path(文件名)
3.truetype():有两种定义格式,第1种格式的功能是加载一个TrueType或者OpenType字体文件,并且创建一个字体对象。
在Windows系统中,如果指定的文件不存在,加载器就会顺便看看Windows的字体目录下它是否存在。(C盘windows下fonts字体)
格式:ImageFont.truetype(file,size) 例如:file="C:\\Windows\\Fonts\\字体"
第二种格式的功能是加载一个TrueType或者OpenType字体文件,并且创建一个字体对象,通常编码方式为"unic"(Unicode)
"symb"(MicrosoftSymbol)、"ADDB"(Adobe Standard)、"ADBE"(Adobe Expert)和"armn"(Apple Roman)
格式:ImageFont.truetype(file,size,encoding=value)
4.load_default():加载一种默认字体
格式:ImageFont.load_default()
5.getsize():返回文本的宽度和高度,返回值为一个二元组
格式:ImageFont.getsize()
"""
from PIL import Image,ImageDraw,ImageFont
img = Image.new('RGB',(100,100),'red')
imgdraw = ImageDraw.Draw(img)
font = ImageFont.truetype('SIMLI.TTF',20)
imgdraw.text((10,10),text='hello python',fill='white',font=font)
img.show()
font = ImageFont.load_default()
imgdraw.text((10,10),text='hello python',fill='white',font=font)
img.show()
三、绘制十字案例
"""
绘制十字
"""
from PIL import Image,ImageDraw
img = Image.open('clock.png')
imgdraw = ImageDraw.Draw(img)
w,h = img.size
imgdraw.line((0,0,w,h),fill='green',width=3)
imgdraw.line((w,0,0,h),fill='green',width=3)
img.show
四、绘制验证码
"""
绘制验证码
"""
from PIL import Image,ImageFilter,ImageDraw,ImageFont
import random
img = Image.new('RGB',(200,200),color='white')
imgdraw = ImageDraw.Draw(img)
def get_color():
return (random.randint(200,255),random.randint(200,255),random.randint(200,255))
def get_char():
return chr(random.randint(65,90))
for x in range(200):
for y in range(200):
imgdraw.point((x,y),fill=get_color())
font=ImageFont.truetype('simsun.ttc',35)
for i in range(4):
imgdraw.text((10+i*20,50),get_char(),font=font,fill='red')
img.show()