安裝 PIL模塊
- pip3 install pillow
生成 圖片
from PIL import Image
img = Image.new(mode='RGB',size=(120,30),color=(0,255,255))
# 查看 圖片
# img.show()
# 保存 圖片 到本地
with open('code.png','wb') as f:
img.save(f,format='png')
- 創建畫筆,在圖片上畫內容
from PIL import Image,ImageDraw
img = Image.new(mode='RGB',size=(120,30),color=(0,255,255))
draw = ImageDraw.Draw(img,mode='RGB')
# 畫點
draw.point([100,10],fill='red')
draw.point([100, 20], fill='red')
draw.point([100, 25], fill='red')
# 畫線
draw.line((10,10,100,20),fill=(255,0,255))
# 畫圓
draw.arc((0,0,30,20),0,360,fill='red')
# 寫文字
draw.text([0,0],'python','red')
# 加入特殊字體
from PIL import ImageFont
font = ImageFont.truetype('kumo.ttf',28)
draw.text([0,0],'python','red',font=font)
- 上面 是把生成寫入本地 這種方法是不好的,應該把這個圖片寫入到內存裏
from PIL import Image,ImageDraw,ImageFont
from io import BytesIO
f = BytesIO()
img = Image.new(mode='RGB',size=(120,30),color=(0,255,255))
draw = ImageDraw.Draw(img,mode='RGB')
# .......
img.save(f,'png')
# 取圖片
data = f.getvalue()
- 生成隨機驗證碼圖片
# views.py
def check_code(request):
from io import BytesIO
from utils.random_check_code import rd_check_code
img,code = rd_check_code()
stream = BytesIO()
img.save(stream,'png')
request.session['code'] = code
return HttpResponse(stream.getvalue())
# random_check_code.py
from PIL import Image,ImageDraw,ImageFont,ImageFilter
import random
def rd_check_code(width=120, height=30, char_length=5, font_file='kumo.ttf', font_size=28):
code = []
img = Image.new(mode='RGB', size=(width, height), color=(255, 255, 255))
draw = ImageDraw.Draw(img, mode='RGB')
def rndChar():
"""
生成隨機字母
:return:
"""
return chr(random.randint(65, 90))
def rndColor():
"""
生成隨機顏色
:return:
"""
return (random.randint(0, 255), random.randint(10, 255), random.randint(64, 255))
# 寫文字
font = ImageFont.truetype(font_file, font_size)
for i in range(char_length):
char = rndChar()
code.append(char)
h = random.randint(0, 4)
draw.text([i * width / char_length, h], char, font=font, fill=rndColor())
# 寫干擾點
for i in range(40):
draw.point([random.randint(0, width), random.randint(0, height)], fill=rndColor())
# 寫干擾圓圈
for i in range(40):
draw.point([random.randint(0, width), random.randint(0, height)], fill=rndColor())
x = random.randint(0, width)
y = random.randint(0, height)
draw.arc((x, y, x + 4, y + 4), 0, 90, fill=rndColor())
# 畫干擾線
for i in range(5):
x1 = random.randint(0, width)
y1 = random.randint(0, height)
x2 = random.randint(0, width)
y2 = random.randint(0, height)
draw.line((x1, y1, x2, y2), fill=rndColor())
img = img.filter(ImageFilter.EDGE_ENHANCE_MORE)
return img,''.join(code)