Code
using System;
using System.Collections.Generic;
using System.Web;
using System.Security.Cryptography;
using System.Drawing;
using System.IO;
using System.Drawing.Imaging;

namespace Test.CheckCode
{
    /// <summary>
    /// 举行左上角坐标和X、Y距离
    /// </summary>
    public class Coordinate
    {
        private int x;
        private int y;
        private int xDistance = 0;
        private int yDistance = 0;

/// <summary>
        /// X距离
        /// </summary>
        public int XDistance
        {
            get { return xDistance; }
            set { xDistance = value; }
        }

/// <summary>
        /// Y距离
        /// </summary>
        public int YDistance
        {
            get { return yDistance; }
            set { yDistance = value; }
        }

/// <summary>
        /// X点坐标
        /// </summary>
        public int X
        {
            get { return x; }
            set { x = value; }
        }

/// <summary>
        /// Y点坐标
        /// </summary>
        public int Y
        {
            get { return y; }
            set { y = value; }
        }
    }

/// <summary>
    /// 反色矩形集合生产器
    /// </summary>
    public class ReverseCoordinates
    {
        /// <summary>
        /// 单件模式 实例
        /// </summary>
        public static readonly ReverseCoordinates Instance = new ReverseCoordinates();
        /// <summary>
        /// 总长度
        /// </summary>
        public const int TotalLenght = 650;

/// <summary>
        /// 总宽度
        /// </summary>
        public const int TotalHeight = 250;
        private List<Coordinate> list = new List<Coordinate>();

private ReverseCoordinates()
        { }

/// <summary>
        /// 返回要反色矩形左上角坐标的集合
        /// </summary>
        /// <returns>反色矩形左上角坐标的集合</returns>
        public List<Coordinate> GetList()
        {
            this.CreateList();

return this.list;
        }

/// <summary>
        /// 创建反色矩形左上角坐标的集合
        /// </summary>
        private void CreateList()
        {
            Random random = new Random(Guid.NewGuid().GetHashCode());

//创建4个角反色矩形的长和宽
            int cornerXDistance = random.Next(1, Convert.ToInt32(TotalLenght / 15));
            int cornerYDistance = random.Next(1, Convert.ToInt32(TotalLenght / 5));

this.list = new List<Coordinate>();

//创建左上角反色矩形
            Coordinate coordinate = new Coordinate();

coordinate.X = 1;
            coordinate.Y = 1;
            coordinate.XDistance = cornerXDistance;
            coordinate.YDistance = cornerYDistance;

this.list.Add(coordinate);

//创建左下角反色矩形
            coordinate = new Coordinate();

coordinate.X = 1;
            coordinate.Y = TotalHeight - cornerYDistance;
            coordinate.XDistance = cornerXDistance;
            coordinate.YDistance = cornerYDistance;

this.list.Add(coordinate);

//创建右上角反色矩形
            coordinate = new Coordinate();

coordinate.X = TotalLenght - cornerXDistance;
            coordinate.Y = 1;
            coordinate.XDistance = cornerXDistance;
            coordinate.YDistance = cornerYDistance;

this.list.Add(coordinate);

//创建右下角反色矩形
            coordinate = new Coordinate();

coordinate.X = TotalLenght - cornerXDistance;
            coordinate.Y = TotalHeight - cornerYDistance;
            coordinate.XDistance = cornerXDistance;
            coordinate.YDistance = cornerYDistance;

this.list.Add(coordinate);

//创建中间大的反色矩形
            coordinate = new Coordinate();

//得到每个字的大概大小
            int fontSize = Convert.ToInt32(TotalLenght / 3.3);

//得到每个字大概中间的部位的X值
            int[] sizeArray = new int[4];

sizeArray[0] = fontSize;
            sizeArray[1] = fontSize * 1 - fontSize;
            sizeArray[2] = fontSize * 2 - fontSize;
            sizeArray[3] = fontSize * 3 - fontSize;

//随机选取中间反色矩形的X值
            int index = random.Next(0, 3);

//得到中间反色矩形和左上角矩形的距离
            int beginX = sizeArray[index] - cornerXDistance;

//如果两个矩形重叠
            if (beginX < 0)
            {
                //将负的距离变正数
                beginX *= -1;
            }
            else
            {
                beginX = 0;
            }

//为了每次中间的反色矩形位置都不一样计算偏移值
            int offset = random.Next(beginX, Convert.ToInt32(fontSize / 2));

coordinate.X = sizeArray[index] + offset;
            coordinate.Y = random.Next(1, Convert.ToInt32(TotalHeight / 2));
            coordinate.XDistance = random.Next(Convert.ToInt32(TotalLenght / 6), Convert.ToInt32(TotalLenght / 3));
            coordinate.YDistance = random.Next(Convert.ToInt32(TotalHeight / 2), TotalHeight - 1);

this.list.Add(coordinate);
        }

}

/// <summary>
    /// 验证码生成器
    /// </summary>
    public class ValidateCode
    {
        private string checkCode;

/// <summary>
        /// 验证码
        /// </summary>
        public string CheckCode
        {
            get { return checkCode; }
            set { checkCode = value; }
        }

public ValidateCode()
        {
            this.GenerateCheckCode();
        }

/// <summary>
        /// 创建随机字符串
        /// </summary>
        private void GenerateCheckCode()
        {
            int number;
            char code;
            this.checkCode = String.Empty;
            Random random = new Random();
            for (int i = 0; i < 4; i++)
            {
                number = random.Next();
                code = (char)('0' + (char)(number % 10));
                this.checkCode += code.ToString();
            }
        }

/// <summary>
        /// 生产图片
        /// </summary>
        public void CreateCheckCodeImage()
        {
            ReverseCoordinates coordinates = ReverseCoordinates.Instance;

int totalLenght = ReverseCoordinates.TotalLenght;
            int totalHeight = ReverseCoordinates.TotalHeight;

Bitmap image = null;
            Graphics graphics = null;
            MemoryStream ms = null;

try
            {
                image = new Bitmap(totalLenght + 1, totalHeight + 1);
                graphics = Graphics.FromImage(image);
                ms = new MemoryStream();

//清空图片背景色
                graphics.Clear(Color.White);
                Font fontA = new Font("Arial", Convert.ToInt32(totalLenght / 3.3), (FontStyle.Bold | FontStyle.Italic));

Random random = new Random(Guid.NewGuid().GetHashCode());
                int offset = random.Next(-5, 0);

graphics.DrawString(checkCode, fontA, Brushes.Black, offset, offset);
                
                Color pixel;

List<Coordinate> list = coordinates.GetList();

foreach (Coordinate coordinate in list)
                {
                    int x = coordinate.X;

for (int i = 0; i < coordinate.XDistance && x < totalLenght; i++, x++)
                    {
                        int y = coordinate.Y;

for (int j = 0; j < coordinate.YDistance && y < totalHeight; j++, y++)
                        {
                            int r, g, b;
                            pixel = image.GetPixel(x, y);

r = 255 - pixel.R;
                            g = 255 - pixel.G;
                            b = 255 - pixel.B;

image.SetPixel(x, y, Color.FromArgb(r, g, b));
                        }
                    }
                }

//画图片的边框线
                graphics.DrawRectangle(new Pen(Color.Silver), 0, 0, image.Width - 1, image.Height - 1);

image.Save(ms, ImageFormat.Gif);

HttpResponse httpResponse = HttpContext.Current.Response;
                httpResponse.ClearContent();
                httpResponse.Expires = 0;
                httpResponse.ExpiresAbsolute = DateTime.Now.AddSeconds(-1);
                httpResponse.ContentType = "image/Gif";
                httpResponse.BinaryWrite(ms.ToArray());
            }
            finally
            {
                graphics.Dispose();
                image.Dispose();
                ms.Dispose();
            }

}
    }
}

转载于:https://www.cnblogs.com/bluersw/archive/2009/08/07/1541006.html

一种新的验证码(改进版)相关推荐

  1. c语言gga字符串校验和代码,一种新的Java智能卡上字节码校验算法.pdf

    您所在位置:网站首页 > 海量文档 &nbsp>&nbsp计算机&nbsp>&nbspJava 一种新的Java智能卡上字节码校验算法.pdf4页 本 ...

  2. 一种新的高级抖动分离解析方法

    一种新的高级抖动分离解析方法 A new analytic approach for advanced jitter separation 抖动分量的分析是现代通信系统调试中一项越来越重要的任务.一方 ...

  3. 一种新的攻击方式:使用Outlook 表单进行横向渗透和常驻

    本文讲的是一种新的攻击方式:使用Outlook 表单进行横向渗透和常驻, 背景 最近我们针对CrowdStrike服务进行例行调查,发现了一种攻击方法,其主要用于横向渗透和系统常驻,而且是以前我们没有 ...

  4. Lyft推出一种新的实时地图匹配算法

    点击上方"3D视觉工坊",选择"星标" 干货第一时间送达 打车有时也会职业病发作,琢磨一下车辆调度是怎么做的,路径规划算法要怎么写,GPS偏移该怎么纠正等等.不 ...

  5. CBNet:物体检测的一种新的组合主干网络结构

    2019-12-11 20:36:00 作者:Tony Shin 编译:ronghuaiyang 导读 给大家介绍一种新的网络架构,用来做物体检测的,SOTA. 到目前为止,在COCO数据集上表现最好 ...

  6. Facebook TensorMask:一种新的密集滑动窗口分割技术

    导语:TunSoMeM 为探索分割研究提供了新的方向 语音播放文章内容 由深声科技提供技术支持 近日,Facebook 发布了一项新的研究,该研究探索了实例分割的新方法.与掩模 R-CNN 驱动的标准 ...

  7. 一种新的计算机视觉技术?将手机的摄像头变成了一个搜索引擎

    https://www.toutiao.com/a6698870195391300099/ 智能手机,安全摄像头和扬声器仅仅是行将运行更加人工智能软件以加快图像和语音处置使命的装备中的一小部分.增添硬 ...

  8. 牛顿第三定律不再起作用:芝加哥大学找到了一种新系统,作用力不等于反作用力...

    来源:AI科技评论 作者:吴彤 编辑:青暮 世界上还有许多并未达到平衡的系统,比如生命,在这样的系统中,牛顿第三定律失效了.目前,芝加哥大学的研究员找到了一种思考非平衡系统中相变的新方法. 牛顿第三运 ...

  9. 华为等向联合国提议重构互联网:提议采用一种新的核心网络技术新标准,名为“New IP”...

    来源:云头条 新架构将支持尖端技术,华为曾表示,新技术的一些部分已经在建造中,相关部分已准备好在2021年之前进行测试. 以下为<演示文稿>: <金融时报>消息,中国已向联合国 ...

最新文章

  1. .NET中,字符串首字母大写的方法
  2. 51CTO我的梦想将在这里起航【我与51CTO的故事】
  3. Kubernetes — MACVLAN CNI
  4. 树莓派3B创建WiFi热点
  5. git apply、git am打补丁.diff 和 .patch
  6. UNIX:缓冲区和重定向
  7. JZOJ 5392. 【NOIP2017提高A组模拟10.5】Lucky Transformation
  8. 【MFC】MFC开发之前言
  9. 详解Java反射机制
  10. 任女尔(1990-),女,北京卡达克数据技术中心软件业务本部助理工程师,主要研究方向为大数据、云计算。...
  11. 理解SVN中trunk,branches,tags
  12. ajax顺序请求你,ajax请求之返回数据的顺序问题分析
  13. 使用 Proteus 仿真 STM32
  14. VxWorks任务调度
  15. 拖拽 开发 easyui php,Easyui-Builder
  16. 中南大学计算机网络期末试卷,中南大学计算机网络期末复习试卷1
  17. mysql数据库1129错误
  18. 专业术语常用名词缩写中英文对照
  19. SD-WAN的几种典型部署和实践
  20. 单片机及开发板的介绍

热门文章

  1. 智慧停车介绍、产业链市场全透析
  2. DeepMind 的2017:有 AlphaGo,更有社会责任
  3. 三星的 Logo 原来是这么来哦! | 每日趣闻
  4. 17 个品牌,113 款 5G 手机,5G 离我们越来越近
  5. RecyclerView + SnapHelper实现炫酷ViewPager效果
  6. 基于htmlparser实现网页内容解析
  7. nginx 将请求全部指向到一个页面
  8. LINUX系统管理员技术(Admin)-------第三天
  9. SpringMVC之使用Validator接口进行验证
  10. 如何做好网站开发项目需求分析(转)