zoukankan      html  css  js  c++  java
  • 一个图片验证码的实现

    其实实现一个图片验证码并不是什么难的问题,主要讲究的时验证的实现上如何提高程序的识别难度.所以在实现过程参考了一下google的做法,由于数字或字母适当重叠对人自身识别并不成什么问题,但对于计算增加的难度相对来说就比较高些了.如果感觉难度不大可以调整一下程序让让字母之间紧靠的近一点,也可适当地加下曲线来让分析上更难.不过做得太过的话,估计人自己都搞不清楚了:)

    验证码效果

    具体实现代码

    using System;
    using System.Collections.Generic;
    using System.Drawing;
    using System.Drawing.Drawing2D;
    using System.Text;
    
    namespace Smark.ImageNumber
    {
        /// 
        /// Copyright © henryfan 2012		 
        /// Email:	henryfan@msn.com	
        /// HomePage:	http://www.ikende.com		
        /// CreateTime:	2012/10/23 21:18:29
        /// 
        public class Generator
        {
            const string VALUE = "123456789";
    
            private static Dictionary mCharImages = new Dictionary(26);
    
            private static Image mLine;
    
            private static Random mRam = new Random();
    
            public static string GeneratorCode()
            {
                string code = "";
                for (int i = 0; i < 4; i++)
                {
                    code += VALUE.Substring(GetRamValue() % VALUE.Length, 1);
                }
                return code;
    
            }
    
            static int GetRamValue()
            {
    
                return mRam.Next();
            }
    
            public static Image GetImage(string code)
            {
                Bitmap tmpImg = new Bitmap(100, 40);
                using (Graphics e = Graphics.FromImage(tmpImg))
                {
    
                    int offset = 2;
    
                    e.FillRectangle(new SolidBrush(Color.White), 0, 0, 200, 60);
    
                    List items = new List();
                    foreach (char key in code)
                    {
                        items.Add(GetGeneratorItem(key));
                    }
                    for (int i = 0; i < items.Count; i++)
                    {
                        if (i > 0)
                        {
                            if ((items[i].Value < 0 && items[i - 1].Value > 0) || (items[i].Value > 0 && items[i - 1].Value > 0)
                                || (items[i].Value < 0 && items[i - 1].Value < 0))
                                offset += 12;
    
                            else
                                offset += 18;
                        }
                        using (Image img = items[i].DrawImage())
                        {
                            if (Math.Abs(items[i].Value) > 20)
                                e.DrawImage(img, offset, 6);
                            else if (Math.Abs(items[i].Value) > 20)
                                e.DrawImage(img, offset, 4);
                            else
                                e.DrawImage(img, offset, 2);
                        }
    
                    }
    
    
                }
                return tmpImg;
            }
    
            public static System.Collections.IEnumerable GetKeys
            {
                get
                {
                    return mCharImages.Keys;
                }
            }
    
            private static GeneratorItem GetGeneratorItem(char key)
            {
                GeneratorItem item = new GeneratorItem();
                int value = GetRamValue() % 25;
                if (value < 10)
                    value = 10;
                if (GetRamValue() % 2 == 0)
                    value = -value;
                item.Value = value;
                item.Key = key;
                return item;
            }
    
            class GeneratorItem
            {
                public int Value { get; set; }
                public char Key { get; set; }
                public Image DrawImage()
                {
                    Bitmap tmpImg = new Bitmap(50, 50);
                    using (Graphics e = Graphics.FromImage(tmpImg))
                    {
                        e.RotateTransform(Value, System.Drawing.Drawing2D.MatrixOrder.Append);
                        e.DrawImage(mCharImages[Key], 0, 0);
                        e.Flush();
                    }
                    return tmpImg;
                }
            }
    
            static Generator()
            {
    
                HatchBrush sb = new HatchBrush(HatchStyle.Percent40, Color.Black, Color.Black);
    
                foreach (char item in VALUE)
                {
    
                    Bitmap bmp = new Bitmap(50, 50);
                    using (Graphics g = Graphics.FromImage(bmp))
                    {
                        g.DrawString(new string(new char[] { item }), new Font("宋体", 24, FontStyle.Italic), sb, 2, 2);
                    }
                    mCharImages[item]= bmp;
                }
    
                mLine = new Bitmap(60, 4);
                using (Graphics g = Graphics.FromImage(mLine))
                {
                    g.FillRectangle(sb, 0, 0, 60, 3);
                }
    
            }
        }
    }
    访问Beetlex的Github
  • 相关阅读:
    keepalive高可用集群(nginx)
    nginx负载均衡
    linux-------lnmp安装
    nginx编译安装
    Django+MySQL安装配置详解(Linux)[更新为1.8.2版]
    linux性能监控——CPU、Memory、IO、Network
    linux 时钟时间,用户CPU时间,系统CPU时间 .
    指针用作传出参数时,需要二级指针
    僵尸进程&孤儿进程
    XHProf是一个分层PHP性能分析工具。
  • 原文地址:https://www.cnblogs.com/smark/p/2742329.html
Copyright © 2011-2022 走看看