.net生成随机验证码图片
/// <summary>
/// 自定义图片验证码函数
/// 该函数将生成一个图片验证码,并将生成的code存放于Session["VerifyCode"]变量内。
/// </summary>
/// <param name="codeLength">验证码长度</param>
/// <param name="codeFontsize">字体大小</param>
/// <value>该函数将生成一个图片验证码,并把生成的code存放于Session["VerifyCode"]变量内</value>
public static void VerifyCode(int codeLength, int codeFontsize)
{
double PI = 6.283185307179586476925286766559;
int m_ImgWidth = (int)(codeLength * (codeFontsize + 2.5)) + ; //图像宽度
int m_ImgHeight = codeFontsize * + ; //图像高度
string[] m_Fonts = { "Arial", "Georgia" }; //随机字体
string[] m_StrarraySource ={"","","","","","","","",
"A","B","C","D","E","F","G","H","J","K","M","N",
"P","Q","R","S","T","U","V","W","X","Y","Z",
"a","b","c","d","e","f","g","h","j","k","m","n",
"p","q","r","s","t","u","v","w","x","y","z"}; //随机字符所包含范围
Color[] m_ColorarraySource ={Color.Maroon,Color.Red,Color.IndianRed,Color.Tomato,Color.OrangeRed,
Color.SaddleBrown,Color.Goldenrod,Color.Olive,Color.OliveDrab,Color.ForestGreen,
Color.Green,Color.SeaGreen,Color.LightSeaGreen,Color.Teal,Color.CadetBlue,
Color.SteelBlue,Color.DodgerBlue,Color.CornflowerBlue,Color.Blue,
Color.MediumSlateBlue,Color.BlueViolet,Color.DarkViolet,Color.Fuchsia,
Color.DeepPink,Color.Crimson};//随机字符颜色所包含范围
string m_StrCode = ""; //用于存放生成的随机数
Random m_StrRandom = new Random();
for (int i = ; i < codeLength; i++)
{
m_StrCode += m_StrarraySource[m_StrRandom.Next(, m_StrarraySource.Length)]; //生成随机字符串
} Bitmap m_BitmapImg = new Bitmap(m_ImgWidth, m_ImgHeight);//定义一个画板 Graphics m_GraphicsSl = Graphics.FromImage(m_BitmapImg);//在画板上定义绘图的实例 Rectangle m_RectangleJx = new Rectangle(, , m_ImgWidth, m_ImgHeight);//定义一个矩形 m_GraphicsSl.FillRectangle(new SolidBrush(Color.White), m_RectangleJx);//填充矩形
//bPsl.DrawString(code, new Font("新宋体", 12), new SolidBrush(Color.Black), bPjx);//在矩形内画出字符串
for (int i = ; i < m_StrCode.Length; i++)
{
m_GraphicsSl.DrawString(m_StrCode.Substring(i, ), new Font(m_Fonts[m_StrRandom.Next(, m_Fonts.Length)].ToString(), codeFontsize, FontStyle.Bold), new SolidBrush(Color.FromKnownColor(m_ColorarraySource[m_StrRandom.Next(, m_ColorarraySource.Length)].ToKnownColor())), i * (codeFontsize + ) + , Convert.ToBoolean(i % ) ? (m_ImgHeight - codeFontsize - ) / : (m_ImgHeight - codeFontsize - ) / );
} //生成干扰
Random m_RandomR = new Random(); //生成干扰线条
Pen pen = new Pen(new SolidBrush(Color.FromKnownColor(m_ColorarraySource[m_StrRandom.Next(, m_ColorarraySource.Length)].ToKnownColor())), );
for (int i = ; i < m_ImgHeight / ; i++)
{
m_GraphicsSl.DrawLine(pen, new Point(m_RandomR.Next(, m_ImgWidth), m_RandomR.Next(, m_ImgHeight)), new Point(m_RandomR.Next(, m_ImgWidth), m_RandomR.Next(, m_ImgHeight)));
} //生成干扰点
//SolidBrush m_SolidbrushP2 = new SolidBrush(ColorTranslator.FromHtml("#f0f0f0"));//干扰点颜色
SolidBrush m_SolidbrushP2 = new SolidBrush(Color.FromKnownColor(m_ColorarraySource[m_StrRandom.Next(, m_ColorarraySource.Length)].ToKnownColor()));//干扰点颜色
for (int i = ; i < m_ImgWidth / ; i++)
{
for (int j = ; j < m_ImgHeight / ; j++)
{
m_GraphicsSl.FillEllipse(m_SolidbrushP2, m_RandomR.Next(m_ImgWidth), j, m_RandomR.Next(), );//在矩形内画干扰点
}
}
m_GraphicsSl.Dispose(); //正弦曲线Wave扭曲图片
Bitmap m_TempBmp = new Bitmap(m_ImgWidth, m_ImgHeight); // 将位图背景填充为白色
Graphics m_Graph = Graphics.FromImage(m_TempBmp);
m_Graph.FillRectangle(new SolidBrush(Color.White), , , m_ImgWidth, m_ImgHeight);
m_Graph.Dispose(); for (int i = ; i < m_ImgWidth; i++)
{
for (int j = ; j < m_ImgHeight; j++)
{
double m_dx = (PI * (double)j) / (double)m_ImgHeight + ;
double m_dy = Math.Sin(m_dx); // 取得当前点的颜色
int m_nOldX = , m_nOldY = ;
m_nOldX = i + (int)(m_dy * );
m_nOldY = j; Color m_color = m_BitmapImg.GetPixel(i, j);
if (m_nOldX >= && m_nOldX < m_ImgWidth && m_nOldY >= && m_nOldY < m_ImgHeight)
{
m_TempBmp.SetPixel(m_nOldX, m_nOldY, m_color);
}
}
}
m_BitmapImg = m_TempBmp; //生成边框
Graphics m_GraphicsSl2 = Graphics.FromImage(m_BitmapImg);//在画板上定义绘图的实例
m_GraphicsSl2.DrawRectangle(new Pen(Color.FromKnownColor(m_ColorarraySource[m_StrRandom.Next(, m_ColorarraySource.Length)].ToKnownColor()), ), , , m_ImgWidth - , m_ImgHeight - ); //bPimg.Save(fullfilename, System.Drawing.Imaging.ImageFormat.Gif);//保存为文件 m_BitmapImg.Save(System.Web.HttpContext.Current.Response.OutputStream, System.Drawing.Imaging.ImageFormat.Jpeg);//将图片显示出来 //释放资源
m_GraphicsSl.Dispose();
m_BitmapImg.Dispose();
//返回值 //将字符串保存到Session中,以便需要时进行验证
System.Web.HttpContext.Current.Session["VerifyCode"] = m_StrCode;
}
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Drawing; namespace FeiBoLaiTe.Admin
{
public partial class Yanzhengma : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{
if (!Page.IsPostBack)
{
GenImg(GenCode());
}
}
private string GenCode(int num)
{
string[] source ={"","","","","","","","","","",
"A","B","C","D","E","F","G","H","I","J","K","L","M","N",
"O","P","Q","R","S","T","U","V","W","X","Y","Z"};
string code = "";
Random rd = new Random();
for (int i = ; i < num; i++)
{
code += source[rd.Next(, source.Length)];
}
return code;
} //生成图片
private void GenImg(string code)
{
Bitmap myPalette = new Bitmap(, );//定义一个画板 Graphics gh = Graphics.FromImage(myPalette);//在画板上定义绘图的实例 Rectangle rc = new Rectangle(, , , );//定义一个矩形 gh.FillRectangle(new SolidBrush(Color.CornflowerBlue), rc);//填充矩形
gh.DrawString(code, new Font("宋体", ), new SolidBrush(Color.White), rc);//在矩形内画出字符串 myPalette.Save(Response.OutputStream, System.Drawing.Imaging.ImageFormat.Jpeg);//将图片显示出来 Session["code"] = code;//将字符串保存到Session中,以便需要时进行验证 gh.Dispose();
myPalette.Dispose();
}
}
}
private string GenerateCheckCode()
{
int number;
string strCode = string.Empty;
//随机种子
//Random random = new Random();
//for (int i = 0; i < 4; i++) //验证码长度为4
//{
// //随机整数
// number = random.Next();
// //字符从0-9,A-Z中产生,对应的ASCII码为48-57,65-90
// number = number % 36;
// if (number < 10)
// {
// number += 48;
// }
// else
// {
// number += 55;
// }
// strCode += ((char)number).ToString();
//} //产生随机字符串
strCode = GenCode(); //将字符串保存在Cookies
Response.Cookies.Add(new HttpCookie("gst_checkCode", strCode));
return strCode; } private string GenCode(int num)
{
string[] source ={"","","","","","","","","","",
"A","B","C","D","E","F","G","H","i","J","K","L","M","N",
"o","P","Q","R","S","T","U","V","W","X","Y","Z"};
string code = "";
Random rd = new Random();
for (int i = ; i < num; i++)
{
code += source[rd.Next(, source.Length)];
}
return code;
} //生成图片
private void CreateCheckCodeImage(string checkCode)
{
//若检验码为空,则直接返回
if (checkCode == null || checkCode.Trim() == string.Empty)
return;
//根据验证码长度确定输出图片的长度
System.Drawing.Bitmap image = new Bitmap((int)Math.Ceiling(float.Parse((checkCode.Length * ).ToString())), ); //创建Graphics对象
System.Drawing.Graphics g = Graphics.FromImage(image); //生成随机数种子
Random random = new Random();
//清除图片背景颜色
g.Clear(Color.White);
//画背景图片的噪音线10条
for (int i = ; i < ; i++)
{
//噪音线起点坐标(x1,y1),终点坐标(x2,y2)
int x1 = random.Next(image.Width);
int x2 = random.Next(image.Width);
int y1 = random.Next(image.Height);
int y2 = random.Next(image.Height);
//用银色线画出噪音线
g.DrawLine(new Pen(Color.Silver), x1, y1, x2, y2);
}
//输出图片中校验码的字体:12号Arial,粗斜体
Font font = new Font("Arial", , FontStyle.Bold);
//线性渐变画刷
System.Drawing.Drawing2D.LinearGradientBrush brush = new System.Drawing.Drawing2D.LinearGradientBrush(new Rectangle(, , image.Width, image.Width), Color.Blue, Color.Purple, 1.2f, true);
g.DrawString(checkCode, font, brush, , );
//画图片的前景噪点50个
for (int i = ; i < ; i++)
{
int x = random.Next(image.Width);
int y = random.Next(image.Height);
image.SetPixel(x, y, Color.FromArgb(random.Next()));
}
//画图片段边框线
g.DrawRectangle(new Pen(Color.SaddleBrown), , , image.Width - , image.Height - );
//创建内存流用于输出图片
System.IO.MemoryStream ms = new System.IO.MemoryStream();
//图片格式指定为png
image.Save(ms, System.Drawing.Imaging.ImageFormat.Png); //清除缓冲区流中的所有输出
Response.ClearContent();
//输出流的Http Mime类型设置为"image/Png"
Response.ContentType = "image/Png";
//输出图片的二进制流
Response.BinaryWrite(ms.ToArray()); //释放Bitmap和Graphics对象
g.Dispose();
image.Dispose();
}
.net生成随机验证码图片的更多相关文章
- struts2生成随机验证码图片
之前想做一个随机验证码的功能,自己也搜索了一下别人写的代码,然后自己重新用struts2实现了一下,现在将我自己实现代码贴出来!大家有什么意见都可以指出来! 首先是生成随机验证码图片的action: ...
- Python利用PIL生成随机验证码图片
安装pillow: pip install pillow PIL中的Image等模块提供了创建图片,制作图片的功能,大致的步骤就是我们利用random生成6个随机字符串,然后利用PIL将字符串绘制城图 ...
- python模块之PIL模块(生成随机验证码图片)
PIL简介 什么是PIL PIL:是Python Image Library的缩写,图像处理的模块.主要的类包括Image,ImageFont,ImageDraw,ImageFilter PIL的导入 ...
- java生成随机验证码图片
import java.awt.Color; import java.awt.Font; import java.awt.Graphics; import java.awt.Graphics2D; i ...
- Python使用PIL模块生成随机验证码
PIL模块的安装 pip3 install pillow 生成随机验证码图片 import random from PIL import Image, ImageDraw, ImageFont fro ...
- Java生成随机验证码
package com.tg.snail.core.util; import java.awt.Color; import java.awt.Font; import java.awt.Graphic ...
- Python 生成随机验证码
Python生成随机验证码 Python生成随机验证码,需要使用PIL模块. 安装: 1 pip3 install pillow 基本使用 1. 创建图片 1 2 3 4 5 6 7 8 9 fro ...
- Python生成随机验证码
Python生成随机验证码,需要使用PIL模块. 安装: pip3 install pillow 基本使用 1.创建图片 from PIL import Image img = Image.new(m ...
- java生成简单验证码图片
概要 最近项目需要用java实现输出随机验证码图片到前台,正好有机会接触下java的绘图类,完成需求后也有时间做个总结,写篇随笔记录下也希望能帮助到有同样需求的人! 需求流程图 1.生成随机数 在ja ...
随机推荐
- Android UI开发第三十四篇——SlidingPaneLayout
SlidingPaneLayout也是系统支持的高级控件,是Android团对在2013 google IO大会期间更新的Support库(Version 13)中新加入的重要的功能.它支持左右滑动菜 ...
- Java 网络编程最佳实践(转载)
http://yihongwei.com/2015/09/remoting-practice/ Java 网络编程最佳实践 Sep 10, 2015 | [Java, Network] 1. 通信层 ...
- Java异常处理的误区和经验总结
本文着重介绍了 Java 异常选择和使用中的一些误区,希望各位读者能够熟练掌握异常处理的一些注意点和原则,注意总结和归纳.只有处理好了异常,才能提升开发人员的基本素养,提高系统的健壮性,提升用户体验, ...
- PHP基本语法(二)
[重点,哪些情况我们会将其它类型的值视为bool值的假:]1. 整型的0会视为bool值的假来执行,任何非0的整型都视为真2. 浮点的0.0不论后面有多少个0都视为假0.000000000,后面只要有 ...
- JBPM学习(四):执行流程实例
概念: ProcessInstance,流程实例:代表流程定义的一次执行.如:张三昨天按请假流程请了一次假.一个流程实例包括了所有运行阶段,其中最典型的属性就是跟踪当前节点的指针,如下图. Execu ...
- $.post()请求 ation请求,jsp获取的处理结果
public void write(String content, String charset) { getHttpResponse().setCharacterEncoding(charset); ...
- Windows环境下安装Ionic
1. 首先要安装node环境,Ionic的安装和后续的许多前端工具的安装都依赖于node的包管理器npm. nodeJs环境的安装很简单,去官网下载最新版的NodeJs直接安装即可. Nod ...
- Java实现文件的RSA和DES加密算法
根据密钥类型不同将现代密码技术分为两类:对称加密算法(秘密钥匙加密)和非对称加密算法(公开密钥加密) 对称钥匙加密系统是加密和解密均采用同一把秘密钥匙,而且通信双方都必须获得这把钥匙,并保持钥匙的秘密 ...
- base查找方法的实现JAVA
import java.util.List; import java.util.ArrayList; import java.util.Scanner; /*在一个有序数组中查找一个数的过程,模拟二分 ...
- iOS之应用程序国际化
一.程序国际化 准备工作: 1.首先我们要先创建一个工程,我们给他命名Internationalization-Demo,然后添加语言. 从代码中分离文本: 目前,应用展示的所有文本都是以硬编码字符串 ...