彩色干扰线验证码

作者: 芝麻绿豆 | 来源:发表于2016-09-14 13:22 被阅读678次

利用Quartz2D实现:
绘图步骤: 1.获取上下文 2.描述路径 3.把路径添加到上下文 4.渲染上下文
drawRect:画线必须要在drawRect方法实现,因为只有在drawRect方法中才能获取到根view相关联上下文;当前控件即将显示的时候调用,只调用一次;
注意: drawRect不能手动调用;drawRect只能系统调用,每次系统调用drawRect方法之前,都会给drawRect方法传递一个跟当前view相关联上下文;
执行[self.view setNeedsDisplay];会调用drawRect。

效果图
#define kRandomColor [UIColor colorWithRed:arc4random()%255/255.0 green:arc4random()%255/255.0 blue:arc4random()%255/255.0 alpha:1.0] //随机颜色
#define kLineCount 6        //干扰线的个数
#define kLineWidth 1.0      //干扰线的宽度
#define kCharCount 5        //需要验证码的个数
#define kFontSize [UIFont systemFontOfSize:arc4random() % 5 + 15]   //字体大小

获取随机验证码

#pragma mark - 获取随机验证码
- (void)getAuthcode {

    _authCodeStr = [[NSMutableString alloc] initWithCapacity:kCharCount];
    _dataArray = @[@1,@2,@4,@5,@7,@8,@0,@9,@"Z",@"W",@"E",@"R",@"L",@"w",@"g",@"j",@"t",@"v"];

    //随机从素材数组中取出需要个数的字符串,拼接为验证码字符串存入验证码数组中
    for (int i = 0; i < kCharCount; i ++){
        NSInteger index = arc4random() % self.dataArray.count;
        [self.authCodeStr insertString:[NSString stringWithFormat:@"%@",self.dataArray[index]] atIndex:i];
    }
    
}

点击view刷新验证码

//点击界面切换验证码
- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event{

    [self getAuthcode];
    [self setNeedsDisplay];
}

绘制验证码和线条

- (void)drawRect:(CGRect)rect {
    [super drawRect:rect];
    self.backgroundColor = [UIColor whiteColor];
    
    /*计算每个字符串显示的位置*/
    NSString *text = [NSString stringWithFormat:@"%@",_authCodeStr];
    
    CGSize cSize = [@"A" sizeWithAttributes:@{NSFontAttributeName:[UIFont systemFontOfSize:20]}];
    
    int width = rect.size.width / text.length - cSize.width;
    int height = rect.size.height - cSize.height;
    CGPoint point;
    
    /*绘制字符*/
    float tempX,tempY;
    for (int i = 0 ; i < text.length; i ++) {
        tempX = arc4random() % width + rect.size.width / text.length * i;
        tempY = arc4random() % height;
        point = CGPointMake(tempX, tempY);
        
        unichar c = [text characterAtIndex:i];
        NSString *textC = [NSString stringWithFormat:@"%C", c];
        
        [textC drawAtPoint:point withAttributes:@{NSFontAttributeName:kFontSize}];
    }
   
    //绘制kLineCount条随机色干扰线
    CGContextRef context = UIGraphicsGetCurrentContext();
    CGContextSetLineWidth(context,kLineWidth);
    for(int cout = 0; cout < kLineCount; cout++)
    {
        
        CGContextSetStrokeColorWithColor(context, kRandomColor.CGColor);
        tempX = arc4random() % (int)rect.size.width;
        tempY = arc4random() % (int)rect.size.height;
        CGContextMoveToPoint(context, tempX, tempY);
        tempX = arc4random() % (int)rect.size.width;
        tempY = arc4random() % (int)rect.size.height;
        CGContextAddLineToPoint(context, tempX, tempY);
        CGContextStrokePath(context);
    }
   
    
}

相关文章

  • 彩色干扰线验证码

    利用Quartz2D实现:绘图步骤: 1.获取上下文 2.描述路径 3.把路径添加到上下文 4.渲染上下文draw...

  • 前端绘制图形验证码

    一、功能分析 图形验证码由验证码、干扰线、干扰点组合而成 验证码由数字和字母随机组合形成 每次切换验证码,验证码字...

  • 阿里汇川验证码图像处理

    验证码获取地址 去除图片干扰线 修复图像 图片转为灰度并且去除噪点

  • 验证码去除干扰线

    在邦购登陆时,选择了人工检验验证码,这次用机器检测试试。先说基本逻辑:载入图像,转灰度,二值化,连通域检测,去除连...

  • tess4j解析数字验证码

    网上看到了验证码破解,除了像12306越升级越变态的验证码很难破解外,其他比如数字、字母、干扰线之类的还是可以轻松...

  • php验证码

    理论分析 1、实现验证码底图 2、实现数字验证码 输出 3、增加干扰元素 (1)、追加干扰点 输出 (2)、追加干...

  • Java Web 项目关于 Kaptcha 验证码的生成与使用

    Web 端中,为了防止恶意的流量攻击或者为了防止自动化提交,都会在页面中引入验证码。验证码一般是一些加入了干扰线...

  • 产生验证码带干扰线js

  • 2018-03-29

    Java中常用工具类 (1)生成随机ID和随机码-UUIDUtils (2)生成随机验证码-带有干扰线效果-Ver...

  • js 滑动拼图验证码

    以前的验证码很简单,就是一个带些背景色或背景图和干扰线的纯数字字母类的验证码,现在已经发展变得很丰富了。我见过的就...

网友评论

    本文标题:彩色干扰线验证码

    本文链接:https://www.haomeiwen.com/subject/ahyvettx.html