python生成中文驗證碼,帶旋轉,帶干擾噪音線段


# -*- coding: utf-8 -*-
"""
Created on Sun Oct  4 15:57:46 2015

@author: keithguofan
"""

import random
from PIL import Image,ImageDraw,ImageFont
import math,string
class RandomChar():
    @staticmethod
    def Unicode():
        val = random.randint(0x4E00,0x9FBF)
        return unichr(val)
    @staticmethod
    def GB2312():
        head=random.randint(0xB0,0xCF)
        body=random.randint(0xA,0xF)
        tail=random.randint(0,0xF)
        val = (head <<8)|(body<<4)|tail
        str="%x" % val
     #   return str.decode('hex').decode('gb2312')
       # return str.encode('gb2312').decode('gb2312')
        return codecs.decode(str,'hex_codec').decode('gb2312')

        
class ImageChar():
    def __init__(self,fontColor=(0,0,0),
                 size=(100,40),
                # fontPath='C:/Windows/Fonts/wqy.ttc',
                 fontPath='C:/Windows/Fonts/simsun.ttc',
                 bgColor=(255,255,255),
                 fontSize=20):
        self.size=size
        self.fontPath=fontPath
        self.bgColor=bgColor
        self.fontSize=fontSize
        self.fontColor=fontColor
        self.font=ImageFont.truetype(self.fontPath,self.fontSize)
        self.image=Image.new('RGB',size,bgColor)
        
    def rotate(self):
        self.image.rotate(random.randint(0,30),expand=0)
    def drawText(self,pos,txt,fill):
        draw=ImageDraw.Draw(self.image)
      #  print(pos)
       # print(txt)
        #print(self.font)
        #print(fill)
        draw.text(pos,txt,font=self.font,fill=fill)
        del draw
        
    def randRGB(self):
        return (random.randint(0,255),
                random.randint(0,255),
                random.randint(0,255))
    
    def randPoint(self):
        (width,height)=self.size
        return (random.randint(0,width),random.randint(0,height))
    def randLine(self,num):
        draw=ImageDraw.Draw(self.image)
        for i in range(0,num):
            draw.line([self.randPoint(),self.randPoint()],self.randRGB())
        del draw
    def randChinese(self,num):
        gap=5
        start=0
        for i in range(0,num):
            char =RandomChar().GB2312()
            x=start + self.fontSize * i +random.randint(0,gap)+gap*i
            self.drawText((x,random.randint(-5,5)),RandomChar().GB2312(),self.randRGB())
            self.rotate()
        self.randLine(18)
        
    def save(self,path):
        self.image.save(path)
        
if __name__ == '__main__':
    ic=ImageChar(fontColor=(100,211,90))
    ic.randChinese(4)
    ic.save("5.jpeg")

    

最近在研究驗證碼識別,中文的驗證碼不太好識別,上面的代碼我參考了一些博客,親測通過。我的python環境是python3.4

生成的圖片大概是這個樣子:

代碼很簡單。

核心思想是:

生成隨機十六進制數字,然后將其轉換為漢字,通過ImageDraw的方法將其打印到圖片中,對字做一些隨機旋轉,然后隨機加入隨機顏色的線段。

如有不懂的可以聯系我哦。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM