Python PIL module and randomly generated Chinese verification code,
Before that, you must first understand the PIL library in Python. PIL is short for Python Imaging Library. PIL is a Python image processing Library that provides a series of modules and methods, such as cropping, translating, rotating, and changing the size. In the PIL library, any Image is represented by an Image object. Therefore, the simplest form of loading an Image is as follows:
from PIL import Imageimage = Image.open("1.jpeg")
In the PIL library, the most common modules are Image, ImageDraw, ImageEnhance, and ImageFile.
PIL: http://www.pythonware.com/products/pil/
Next, we will learn some common operations in PIL:
(1) Change the image size
from PIL import Imageimage = Image.open("1.jpeg")new_img = image.resize((256,256),Image.BILINEAR)new_img.save("2.jpeg")
(2) Rotating Images
from PIL import Imageimage = Image.open("1.jpeg")new_img = image.rotate(45)new_img.save("2.jpeg")
(3) draw a straight line
The ImageDraw module in the PIL Library provides the basic functions for drawing graphs, such as straight lines, arcs, ovans, and rectangles.
from PIL import Image,ImageDrawimage = Image.open("2.jpeg")draw = ImageDraw.Draw(image)width,height = image.sizedraw.line(((0,0),(width-1,height-1)),fill=255)draw.line(((0,height-1),(width-1,0)),fill=255)image.save("2.jpeg")
(4) Draw circles
from PIL import Image,ImageDrawimage = Image.open("2.jpeg")draw = ImageDraw.Draw(image)width,height = image.sizedraw.arc((0,0,width-1,height-1),0,360,fill=255)image.save("2.jpeg")
For more methods, see the help documentation.
Now we will study how to use Python to generate a Chinese verification code. In fact, this problem is simple. We all know that the verification code is generally used to prevent network machines.
Users use an unlimited number of logon attempts to crack the password, so we need to randomly generate Chinese characters for this image for verification. Generally, the Word Table of the image will be
It is very fuzzy, which effectively prevents robot recognition. Therefore, in addition to generating Chinese characters randomly, we also need to add some interference lines.
# -*- coding: utf-8 -*-from PIL import Image,ImageDraw,ImageFontimport randomimport 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') class ImageChar: def __init__(self, fontColor = (0, 0, 0), size = (100, 40), fontPath = '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) draw.text(pos, txt, font=self.font, fill=fill) 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()) 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)ic = ImageChar(fontColor=(100,211, 90))ic.randChinese(4)ic.save("1.jpeg")
Running result: