.net6 中造一个图片验证码

为什么要造这样的轮子?不是有人造过了吗?

  • System.Draw 下的大多数api都仅支持windows平台
  • 目前百度到的资源很少很少....就算找到了,也跟我们想要的没有太大关系

开搞

  • 先装一个Nuget包 SkiaSharp 然后我他吗直接上代码
  • 这是一个创建验证码的方法,如果您有需要的话就cv过去,有注释的,稍微改改就可以了
public MemoryStream CreatePng()
{
  Random random = new();
  string code = random.Next(1000, 9999).ToString();
  //验证码颜色集合  
  var colors = new[] { SKColors.Black, SKColors.Red, SKColors.DarkBlue, SKColors.Green, SKColors.Orange, SKColors.Brown, SKColors.DarkCyan, SKColors.Purple };
  //验证码字体集合
  var fonts = new[] { "Verdana", "Microsoft Sans Serif", "Comic Sans MS", "Arial", "宋体" };
  //相当于js的 canvas.getContext('2d')
  using var image2d = new SKBitmap(100, 30, SKColorType.Bgra8888, SKAlphaType.Premul);
  //相当于前端的canvas
  using var canvas = new SKCanvas(image2d);
  //填充白色背景
  canvas.DrawColor(SKColors.AntiqueWhite);
  //样式 跟xaml差不多
  using var drawStyle = new SKPaint();
  //填充验证码到图片
  for (int i = 0; i < code.Length; i++)
  {
    drawStyle.IsAntialias = true;
    drawStyle.TextSize = 30;
    var font = SKTypeface.FromFamilyName(fonts[random.Next(0, fonts.Length - 1)], SKFontStyleWeight.SemiBold, SKFontStyleWidth.ExtraCondensed, SKFontStyleSlant.Upright);
    drawStyle.Typeface = font;
    drawStyle.Color = colors[random.Next(0, colors.Length - 1)];
    //写字
    canvas.DrawText(code[i].ToString(), (i + 1) * 16, 28, drawStyle);
  }
  //生成三条干扰线
  for (int i = 0; i < 3; i++)
  {
    drawStyle.Color = colors[random.Next(colors.Length)];
    drawStyle.StrokeWidth = 1;
    canvas.DrawLine(random.Next(0, code.Length * 15), random.Next(0, 60), random.Next(0, code.Length * 16), random.Next(0, 30), drawStyle);
  }
  //巴拉巴拉的就行了
  using var img = SKImage.FromBitmap(image2d);
  using var p = img.Encode(SKEncodedImageFormat.Png, 100);
  using var ms = new MemoryStream();
  //保存到流
  p.SaveTo(ms);
  return ms;
}
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容