验证码自动生成

网上有很多,却都不够简单干脆,自己实现了一个。但可惜字体旋转未能成功。

#!/usr/bin/env python
# coding=utf-8

from PIL import Image, ImageDraw, ImageFont
import os, random
from prepare import clearNoise

class ImageCaptcha(object):

    def __init__(self, size=(200, 60)):
        bgColor = self.random_color(200, 255)
        self.image = Image.new(‘RGB‘, size, bgColor)

    def random_color(self, minc, maxc):
        return (random.randint(minc, maxc),
                random.randint(minc, maxc),
                random.randint(minc, maxc))

    def gen_text(self, cnt=6):
        seq = ‘23456789ABCDEFGHIJKLMNOPQRSTUVWXYZ‘
        text = [random.choice(seq) for i in range(cnt)]
        return ‘‘.join(text)

    def draw_text(self, pos, txt):
        draw = ImageDraw.Draw(self.image)
        fontSize = random.choice([38, 42, 56])
       # font = ImageFont.truetype(‘DroidSerif-Bold.ttf‘, fontSize)
        font = ImageFont.truetype(‘Arimo-Bold.ttf‘, fontSize)
        fontColor = self.random_color(0, 150)
        draw.text(pos, txt, font=font, fill=fontColor)

    def rotate(self, angle):
        self.image = self.image.rotate(random.randint(-1*angle, angle), expand=0)

    def gen_captcha_image(self, text):
        for i, txt in enumerate(text):
            x = 8 + i * 30 + random.randint(-10, 10)
            y = random.randint(0, 10)
            self.draw_text((x, y), txt)
        #    self.rotate(5)

        return self.image

def clear_noise(path):
    fnames = [os.path.join(path, fname) for fname in os.listdir(path) if fname.endswith(‘jpg‘)]
    for fname in fnames:
        img = clearNoise(fname)
        img.save(‘auto/clearNoise/%s‘ % fname.split(‘/‘)[-1])
        print img.size, fname, ‘done‘

if __name__== ‘__main__‘:
    for i in range(20):
        test = ImageCaptcha()
        text = test.gen_text(6)
        img = test.gen_captcha_image(text)
        img.save(‘auto/origin/%s_%d.jpg‘ % (text, i))
时间: 2024-08-03 18:01:41

验证码自动生成的相关文章

java自动生成验证码

代码结构: web.xml <?xml version="1.0" encoding="UTF-8"?> <web-app version="3.0" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="

自动生成验证码

经常用到的自动生成验证码小技术,在此总结一下. 可以分为两个部分,一个生成四位随机数,一部分是绘制背景.代码如下: //自动生成验证码 private string GenerateCheckCode() { int number; char code; string checkCode = String.Empty; //随机数 Random random = new Random(); //循环生成四位 for (int i = 0; i < 4; i++) { //自动生成随机数号码 nu

通过JavaScript脚本实现验证码自动输入

很多网站在用户进行某次点击,比如在线购物确认购买时,会要求用户输入验证码,这在一般情况下也没啥问题,但在用户需要频繁购买或是抢购时就很讨厌了.其实网站的验证码一般是由JS脚本生成的,因此也可以通过编写自己的JS脚本来实现验证码自动输入. 大致原理如下,首先观察原网页弹出的验证码图片,这里给出两个示例:,它们都是前景黑白,背景彩色,宽100高20的图片,进一步把图片放到PS里打开可以发现每个数字所占的都是一个宽8高10的矩形,且这5个矩形的位置和相对距离都是固定的.因此,原理就很简单了,事先为每个

轻松学会网页中验证码的生成(JAVA)

验证码生成的基本流程 1.验证码的生成,我们能够看到是用Graphics对象画出来的.对象我们必须要获得Graphics对象 1-1,Graphics对象的获取,要通过BufferedImage获得 <span style="font-size:18px;">int width=100;//确定框框的大小 int height=40; BufferedImage bfi =new BufferedImage(width, height, BufferedImage.TYPE

使用MyBatis Generator自动生成实体、mapper和dao层

通过MyBatis Generator可以自动生成实体.mapper和dao层,记录一下怎么用的. 主要步骤: 关于mybatis从数据库反向生成实体.DAO.mapper: 参考文章:http://www.cnblogs.com/wangkeai/p/6934683.html第一种方式:main方法运行(推荐) 1.在pom.xml中加入插件依赖: 2.写mbgConfiguration.xml文件,jdbc.properties文件 3.写/SSM/src/main/java/main/Ge

kvm一键shell自动生成 windows 虚拟机,无人值守操作方案(step1)

kvm一键shell自动生成 windows 虚拟机,无人值守操作方案分为四个步骤来联合完成: 第一步:开机启动脚本编写,使机器在一启动的时候能够执行该脚本,完成所有需要完成的基本操作(诸如设置密码,绑定Ip,加域,激活),这一步在单独一台机器上反复测试反复编写: 第二步:制定自动应答文件,使其能够无人自动安装,不需要人为干预:也就是消除机器第一次启动时候,需要人工选择<安装语言>,<接受许可协议>等等这些步骤: 第三步:完成以上几步,剩下就需要linux 通过virt-copy-

JavaWeb项目中WEB-INF目录下class文件自动生成以及显示

问题一:WEB-INF目录下的class字节文件是自动生成的,还是需要手动创建相关目录,然后再将字节件复制进去? 可以让eclipse自动生成 source folder:存放.java源文件的根目录 output folder:.class编译输出的根目录纯"java project"中,一般把"src"设置为source folder,把bin设置为output folder "web project"中,一般把"src"

ANTLR和StringTemplate实例:自动生成单元测试类

ANTLR和StringTemplate实例:自动生成单元测试类 1. ANTLR语法 要想自动生成单元测试,首先第一步就是分析被测试类.这里以Java代码为例,用ANTLR对Java代码进行分析.要想靠自己完全手写出一门语言的ANTLR语法文件的复杂程度难以想象,很贴心的是在ANTLR的GitHub网站上列出了很多常见语言的语法文件,例如Java,Sqlite和MySQL的SQL语法等. 有了.g4语法文件,按照Antlr v4入门教程和实例中的步骤,就能自动生成出解析器的代码,这里就不再详述

Android gen根目录下自动生成的R文件指向问题

今天才弄明白,原来在调用vitamio包的时候使用它们的R文件,然后在迁入广告的时候出现了问题,但是瞎胡搞半天后把问题解决了,可没有明白这是什么原因. 今天更新应用又出现了相同的情况,无意中打开了gen的根目录妈蛋!发现里面的报名根本就不是我现在应用的包名.而是调用的那个工程的包名!这下终于找到根本原因了,但是怎么解决呢???----------->修改包名呗~~~~~~~可是你改了它又会自动生成了原来的那个,--------------后来终于发现原来这个R文件的包名适合manifest文件中