Django PIL模組(生成隨機驗證碼)
阿新 • • 發佈:2018-11-19
PIL簡介
什麼是PIL
PIL:是Python Image Library的縮寫,影象處理的模組。主要的類包括Image,ImageFont,ImageDraw,ImageFilter
PIL的匯入
首先需要安裝一下pillow包
1 |
pip install pillow
|
然後就可以呼叫PIL裡的類了
1 2 3 4 |
from
PIL
import
Image
from
PIL
import
ImageFont from
PIL
import
ImageDraw
from
PIL
import
ImageFilter
|
PIL常用方法
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 |
open
()
#開啟圖片
new(mode,size,color)
#建立一張空白圖片
save(
"test.gif"
,
"GIF"
)
#儲存(新圖片路徑和名稱,儲存格式)
size()
#獲取圖片大小
thumbnail(weight,high)
#縮放圖片大小(寬,高)
show()
#顯示圖片
blend(img1,img2,alpha)
#兩張圖片相加,alpha表示img1和img2的比例引數。
crop()
#剪下,提取某個矩陣大小的影象。它接收一個四元素的元組作為引數,各元素為(left, upper, right, lower),座標系統的原點(0, 0)是左上角。
rotate(
45
)
#逆時針旋轉45度
transpose()
#旋轉影象
transpose(Image.FLIP_LEFT_RIGHT)
#左右對換。
transpose(Image.FLIP_TOP_BOTTOM)
#上下對換。
transpose(Image.ROTATE_90)
#旋轉 90 度角。
transpose(Image.ROTATE_180)
#旋轉 180 度角。
transpose(Image.ROTATE_270)
#旋轉 270 度角。
paste(im,box)
#貼上box大小的im到原先的圖片物件中。
convert()
#用來將影象轉換為不同色彩模式。
filters()
#濾鏡
BLUR
#虛化
EMBOSS
resize((
128
,
128
))
#resize成128*128畫素大小
convert(
"RGBA"
)
#圖形型別轉換
getpixel((
4
,
4
))
#獲取某個畫素位置的值
putpixel((
4
,
4
),(
255
,
0
,
0
))
#寫入某個畫素位置的值
|
PIL應用
我們主要用PIL來生成一張驗證碼的隨機圖,下面,我們就一步步來做一個小示例
1、生成一張固定尺寸固定顏色的圖片
1 2 3 4 5 6 |
from
PIL
import
Image
# 獲取一個Image物件,引數分別是RGB模式。寬150,高30,紅色
image
=
Image.new(
'RGB'
,(
150
,
30
),
'red'
)
# 儲存到硬碟,名為test.png格式為png的圖片
image.save(
open
(
'test.png'
,
'wb'
),
'png'
)
|
2、生成一張隨機顏色的圖片
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
from
PIL
import
Image
import
random
def
getRandomColor():
'''獲取一個隨機顏色(r,g,b)格式的'''
c1
=
random.randint(
0
,
255
)
c2
=
random.randint(
0
,
255
)
c3
=
random.randint(
0
,
255
)
return
(c1,c2,c3)
# 獲取一個Image物件,引數分別是RGB模式。寬150,高30,隨機顏色
image
=
Image.new(
'RGB'
,(
150
,
30
),getRandomColor())
# 儲存到硬碟,名為test.png格式為png的圖片
image.save(
open
(
'test.png'
,
'wb'
),
'png'
)
|
3、生成一張帶有固定字串的隨機顏色的圖片
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 |
from
PIL
import
Image
from
PIL
import
ImageDraw
from
PIL
import
ImageFont
import
random
def
getRandomColor():
'''獲取一個隨機顏色(r,g,b)格式的'''
c1
=
random.randint(
0
,
255
)
c2
=
random.randint(
0
,
255
)
c3
=
random.randint(
0
,
255
)
return
(c1,c2,c3)
# 獲取一個Image物件,引數分別是RGB模式。寬150,高30,隨機顏色
image
=
Image.new(
'RGB'
,(
150
,
30
),getRandomColor())
# 獲取一個畫筆物件,將圖片物件傳過去
draw
=
ImageDraw.Draw(image)
# 獲取一個font字型物件引數是ttf的字型檔案的目錄,以及字型的大小
font
=
ImageFont.truetype(
"kumo.ttf"
,size
=
32
)
# 在圖片上寫東西,引數是:定位,字串,顏色,字型
draw.text((
20
,
0
),
'fuyong'
,getRandomColor(),font
=
font)
# 儲存到硬碟,名為test.png格式為png的圖片
image.save(
open
(
'test.png'
,
'wb'
),
'png'
)
|
效果:
4、生成一張帶有隨機字串隨機顏色的圖片
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 |
from
PIL
import
Image
from
PIL
import
ImageDraw
from
PIL
import
ImageFont
import
random
def
getRandomColor():
'''獲取一個隨機顏色(r,g,b)格式的'''
c1
=
random.randint(
0
,
255
)
c2
=
random.randint(
0
,
255
)
c3
=
random.randint(
0
,
255
)
return
(c1,c2,c3)
def
getRandomStr():
'''獲取一個隨機字串,每個字元的顏色也是隨機的'''
random_num
=
str
(random.randint(
0
,
9
))
random_low_alpha
=
chr
(random.randint(
97
,
122
))
random_upper_alpha
=
chr
(random.randint(
65
,
90
))
random_char
=
random.choice([random_num, random_low_alpha, random_upper_alpha])
return
random_char
# 獲取一個Image物件,引數分別是RGB模式。寬150,高30,隨機顏色
image
=
Image.new(
'RGB'
,(
150
,
30
),getRandomColor())
# 獲取一個畫筆物件,將圖片物件傳過去
draw
=
ImageDraw.Draw(image)
# 獲取一個font字型物件引數是ttf的字型檔案的目錄,以及字型的大小
font
=
ImageFont.truetype(
"kumo.ttf"
,size
=
26
)
for
i
in
range
(
5
):
# 迴圈5次,獲取5個隨機字串
random_char
=
getRandomStr()
# 在圖片上一次寫入得到的隨機字串,引數是:定位,字串,顏色,字型
draw.text((
10
+
i
*
30
,
0
),random_char , getRandomColor(), font
=
font)
# 儲存到硬碟,名為test.png格式為png的圖片
image.save(
open
(
'test.png'
,
'wb'
),
'png'
)
|
效果:
5、生成一張帶有噪點的驗證碼圖片
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 |
from
PIL
import
Image
from
PIL
import
ImageDraw
from
PIL
import
ImageFont
import
random
def
getRandomColor():
'''獲取一個隨機顏色(r,g,b)格式的'''
c1
=
random.randint(
0
,
255
)
c2
=
random.randint(
0
,
255
)
c3
=
random.randint(
0
,
255
)
return
(c1,c2,c3)
def
getRandomStr():
'''獲取一個隨機字串,每個字元的顏色也是隨機的'''
random_num
=
str
(random.randint(
0
,
9
))
random_low_alpha
=
chr
(random.randint(
97
,
122
))
random_upper_alpha
=
chr
(random.randint(
65
,
90
))
random_char
=
random.choice([random_num, random_low_alpha, random_upper_alpha])
return
random_char
# 獲取一個Image物件,引數分別是RGB模式。寬150,高30,隨機顏色
image
=
Image.new(
'RGB'
,(
150
,
30
),getRandomColor())
# 獲取一個畫筆物件,將圖片物件傳過去
draw
=
ImageDraw.Draw(image)
# 獲取一個font字型物件引數是ttf的字型檔案的目錄,以及字型的大小
font
=
ImageFont.truetype(
"kumo.ttf"
,size
=
26
)
for
i
in
range
(
5
):
# 迴圈5次,獲取5個隨機字串
random_char
=
getRandomStr()
# 在圖片上一次寫入得到的隨機字串,引數是:定位,字串,顏色,字型
draw.text((
10
+
i
*
30
,
0
),random_char , getRandomColor(), font
=
font)
# 噪點噪線
width
=
150
height
=
30
# 劃線
for
i
in
range
(
5
):
x1
=
random.randint(
0
,width)
x2
=
random.randint(
0
,width)
y1
=
random.randint(
0
,height)
y2
=
random.randint(
0
,height)
draw.line((x1,y1,x2,y2),fill
=
getRandomColor())
# 畫點
for
i
in
range
(
30
):
draw.point([random.randint(
0
, width), random.randint(
0
|