1. 程式人生 > >Django PIL模組(生成隨機驗證碼)

Django PIL模組(生成隨機驗證碼)

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