C#实现图像选择验证码的示例代码

  ///

  /// 获取随机的文字和验证码.

  ///

  ///

  /// 第一个参数 - 图片的类型(文字描述)

  /// 第二个参数 - 图片数组,用来显示图片

  /// 第三个参数 - 图片对应的序号

  /// 第四个参数 - 该类型的图片对应的序号

  ///

  public static Tuple, List, List> GetVCode()

  {

  Random random = new Random();

  var type = random.Next(1, List_Text.Count + 1).ToString();

  var typeName = List_Text.ElementAt(Convert.ToInt32(type) - 1);

  var result = GetVCodeList(type);

  return new Tuple, List, List>(typeName, result.Item1, result.Item2, result.Item3);

  }

  ///

  /// 获取随机的验证码.

  ///

  /// 图片的类型.

  ///

  /// 第一个参数 - 图片数组,用来显示图片

  /// 第二个参数 - 图片对应的序号

  /// 第三个参数 - 该类型的图片对应的序号

  ///

  private static Tuple, List, List> GetVCodeList(string type)

  {

  // 这里的随机码是一个有四个元素的数组,如果发现没有生成指定类型的,就重新生成.

  var list_files = Directory.GetFiles(PathHelper.Path + @"ImagesimageSelect");

  var count = list_files.Count();

  List list_index = new List();

  var list_fileName = new List();

  List list_selectedIndex = new List();

  Random random = new Random();

  while (true)

  {

  while (true)

  {

  var index = random.Next(0, count).ToString();

  if (list_index.Exists(m => m.Equals(index)) == false)

  {

  list_index.Add(index);

  var temp = list_files.ElementAt(Convert.ToInt32(index)).Replace(PathHelper.Path + @"ImagesimageSelect", ""); // 只保留文件名,去掉路径

  list_fileName.Add(temp);

  if(temp.Replace("img", "").Substring(0, 1) == type)

  {

  list_selectedIndex.Add(index);

  }

  }

  if (list_index.Count >= 4)

  {

  break;

  }

  }

  // 判断是否至少生成了一个指定类型的图片

  var flag = false;

  flag = list_fileName.Exists(m =>

  {

  if (m.Contains("img" + type))

  {

  return true;

  }

  return false;

  });

  if (flag == false)

  {

  list_index.Clear();

  list_fileName.Clear();

  list_selectedIndex.Clear();

  continue;

  }

  else

  {

  // 至少生成了一个指定类型的图片

  break;

  }

  }

  // 加载图片

  List list_image = new List();

  for (int i = 0; i < list_fileName.Count; i++)

  {

  var image = Image.FromFile(string.Format(@"{0}ImagesimageSelect{1}", PathHelper.Path, list_fileName.ElementAt(i)));

  list_image.Add((Bitmap)image);

  }

  return new Tuple, List, List>(list_image, list_index, list_selectedIndex);

  }

  ///

  /// 将图片对象转成Base64的字符串.

  ///

  ///

  ///

  public static List BitmapToBase64Str(List bitmap)

  {

  List list = new List();

  for (int i = 0; i < bitmap.Count; i++)

  {

  using (MemoryStream memoryStream = new MemoryStream())

  {

  bitmap.ElementAt(i).Save(memoryStream, ImageFormat.Jpeg);

  byte[] bytes = memoryStream.ToArray();

  list.Add(Convert.ToBase64String(memoryStream.ToArray()));

  }

  }

  return list;

  }

  ///

  /// 将图片对象转成Base64的字符串.

  ///

  ///

  ///

  public static string BitmapToBase64Str(Bitmap bitmap)

  {

  using (MemoryStream memoryStream = new MemoryStream())

  {

  bitmap.Save(memoryStream, ImageFormat.Jpeg);

  byte[] bytes = memoryStream.ToArray();

  return Convert.ToBase64String(memoryStream.ToArray());

  }

  }

  ///

  /// 绘制验证码的图片.

  ///

  ///

  ///

  public static Bitmap DrawImage(string code)

  {

  Color[] list_color =

  {

  Color.FromArgb(240, 230, 140), // 黄褐色(亮)

  Color.FromArgb(138, 54, 15), // 黄褐色(暗)

  Color.FromArgb(51, 161, 201), // 蓝色(亮)

  Color.FromArgb(25, 25, 112), // 蓝色(暗)

  Color.FromArgb(192, 192, 192), // 灰白(亮)

  Color.FromArgb(128, 128, 105), // 灰白(暗)

  };

  Random random = new Random();

  // 创建画板

  Bitmap bitmap = new Bitmap(85, 50);

  // 创建画笔

  Graphics grp = Graphics.FromImage(bitmap);

  grp.Clear(Color.White); // 设置背景色为白色

  // 绘制噪点

  for (int i = 0; i < random.Next(30, 40); i++)

  {

  int x = random.Next(bitmap.Width);

  int y = random.Next(bitmap.Height);

  grp.DrawLine(new Pen(Color.LightGray, 1), x, y, x + 1, y);

  }

  // 绘制随机的线条

  grp.DrawLine(

  new Pen(list_color[random.Next(list_color.Length)], random.Next(3)),

  new Point(random.Next(bitmap.Width / 2), random.Next(bitmap.Height / 2)),

  new Point(bitmap.Width / 2 + random.Next(bitmap.Width / 2), bitmap.Height / 2 + random.Next(bitmap.Height / 2))

  );

  // 绘制验证码

  for (int i = 0; i < code.Length; i++)

  {

  var item = code[i];

  grp.DrawString(item.ToString(),

  new Font(FontFamily.GenericSansSerif, 25, FontStyle.Bold),

  new SolidBrush(list_color[random.Next(list_color.Length)]),

  x: (75 / 2) * i,

  y: random.Next(5));

  }

  // 在验证码上绘制噪点

  for (int i = 0; i < random.Next(15, 25); i++)

  {

  int x = random.Next(bitmap.Width);

  int y = random.Next(bitmap.Height);

  grp.DrawLine(new Pen(list_color[random.Next(list_color.Length)], 1), x, y, x + 1, y);

  }

  // 绘制随机的线条

  grp.DrawLine(

  new Pen(list_color[random.Next(list_color.Length)], random.Next(3)),

  new Point(random.Next(bitmap.Width / 2), random.Next(bitmap.Height / 2)),

  new Point(bitmap.Width / 2 + random.Next(bitmap.Width / 2), bitmap.Height / 2 + random.Next(bitmap.Height / 2))

  );

  return bitmap;

  }