生成验证码图片
大约 1 分钟.netcore笔记
生成验证码图片
引用 SixLabors.Fonts
引用 SixLabors.ImageSharp
引用 SixLabors.ImageSharp.Drawingprivate static readonly string RandomString = "23456789abcdefghijkmnpqrstuvwxyzABCDEFGHJKLMNPQRSTUVWSYZ";
/// <summary>
/// 生成验证码图片
/// </summary>
/// <param name="verifyCode"></param>
/// <param name="width"></param>
/// <param name="height"></param>
/// <returns></returns>
public static byte[] GenerateImgVerifyCode(string verifyCode, int width = 128, int height = 45)
{
////根据验证码的长度确定输出图片的宽度
//int iWidth = (int)Math.Ceiling(verifyCode.Code.Length * 15m);
using Image image = new Image<Rgba32>(width, height);
//漆底色白色
image.Mutate(x => x.DrawLine(Pens.DashDot(Color.White, width), new PointF[] { new PointF() { X = 0, Y = 0 }, new PointF() { X = width, Y = height } }));
FontCollection collection = new();
//加载字体
FontFamily family = collection.Add("./wwwroot/fonts/JetBrainsMono-Bold.ttf");
Font font = family.CreateFont(20, FontStyle.Bold);
PointF startPointF = new PointF(5, 5);
Random random = new Random(); //随机数产生器
Color[] colors = [Color.Red, Color.Blue, Color.Green, Color.Purple, Color.Peru, Color.LightSeaGreen, Color.Lime, Color.Magenta, Color.Maroon, Color.MediumBlue, Color.MidnightBlue, Color.Navy];
//绘制验证码
for (int i = 0; i < verifyCode.Length; i++)
{
image.Mutate(x => x.DrawText(verifyCode[i].ToString(), font, colors[random.Next(colors.Length)], startPointF));
startPointF.X += (int)(width - 10) / verifyCode.Length;
startPointF.Y = random.Next(5, 10);
}
var pen = Pens.DashDot(Color.Silver, 1);
//绘制银色背景噪音线30条
for (var k = 0; k < 30; k++)
{
PointF[] points =
[
new PointF(random.Next(width), random.Next(height)),
new PointF(random.Next(width), random.Next(height)),
];
image.Mutate(x => x.DrawLine(pen, points));
}
using MemoryStream stream = new MemoryStream();
image.SaveAsGif(stream);
return stream.ToArray();
}
/// <summary>
/// 获取Code码
/// </summary>
/// <returns></returns>
public static string GetRandomString()
{
Random random = new();
StringBuilder sb = new StringBuilder();
for (int i = 0; i < 4; i++)
{
int number = random.Next(RandomString.Length);
sb.Append(RandomString[number]);
}
return sb.ToString();
}