要生成的目的验证码
完整代码见最后
-
目的是要生成下面的三组验证码
1、下面是captcha未经修改生成的样式,尺寸为160x80
2、下面是保持原来字符形状旋转监督不变,去除所有干扰生成的样式,尺寸160x80,
这个步骤参考这位老哥的
3、下面是在上面的基础上拉伸之后,使得字符无粘连的样式。通过在字符间绘制一个空白达到拉伸效果,
拉伸后尺寸为200x80
方法就是这样,很简单,下面是步骤和代码。
步骤
-
通过导入包可以发现
from captcha.image import ImageCaptcha
验证码是通过captcha包里面的image.py生成的。 -
从image.py里面最终返回验证码图片这里可以发现,是通过如下的
create_captcha_image()
这个方法产生的没有干扰的验证码图片,而干扰是由后面的create_noise_dots(), create_noise_curve()
这两个方法进行另外加入的。def generate_image(self, chars): """Generate the image of the given characters. :param chars: text to be generated. """ background = random_color(238, 255) color = random_color(10, 200, random.randint(220, 255)) im = self.create_captcha_image(chars, color, background) self.create_noise_dots(im, color) self.create_noise_curve(im, color) im = im.filter(ImageFilter.SMOOTH) return im
-
通过上面可以发现生成第二种验证码(去除噪声和背景)就很简单了,下面是一个最简单的方法,就是在还没加干扰之前复制一份就行了,如下加一行代码,想得到白色背景的验证码需要传入背景颜色,见上面的参考,或者本文最后面的完整代码处。
im = self.create_captcha_image(chars, color, background) # 在这里复制一份,多返回一份 im2 = im.copy() im2 = im2.filter(ImageFilter.SMOOTH) self.create_noise_dots(im, color) self.create_noise_curve(im, color) im = im.filter(ImageFilter.SMOOTH) return im, im2
但是这样得来的验证码背景还不是白色,而是和原来的一样的背景,如下:
-
下面是得到白色背景,以及拉伸之后的验证码修改后的完整代码
# coding: utf-8 """ captcha.image ~~~~~~~~~~~~~ Generate Image CAPTCHAs, just the normal image CAPTCHAs you are using. """ import os import random from PIL import Image from PIL import ImageFilter from PIL.ImageDraw import Draw from PIL.ImageFont import truetype try: from cStringIO import StringIO as BytesIO except ImportError: from io import BytesIO try: from wheezy.captcha import image as wheezy_captcha except ImportError: wheezy_captcha = None # 默认字体 DATA_DIR = os.path.join(os.path.abspath(os.path.dirname(__file__)), 'data') DEFAULT_FONTS = [os.path.join(DATA_DIR, 'DroidSansMono.ttf')] if wheezy_captcha: __all__ = ['ImageCaptcha', 'WheezyCaptcha'] else: __all__ = ['ImageCaptcha'] table = [] for i in range(256): table.append(i * 1.97) class _Captcha(object): def generate(self, chars, format='png'): """Generate an Image Captcha of the given characters. :param chars: text to be generated. :param format: image file format """ im = self.generate_image(chars) out1 = BytesIO() out2 = BytesIO() out3 = BytesIO() im[0].save(out1, format=format) im[