Files
Web_AUTS_New_Prod/WebAPIServer/Extensions/CaptchaHelperSkiaSharp.cs

86 lines
3.0 KiB
C#
Raw Normal View History

2025-11-20 14:07:55 +08:00
using System.Text;
using SkiaSharp;
using static IronPython.Modules._ast;
namespace WebAPIServer.Extensions
{
public class CaptchaHelperSkiaSharp
{
private static string GenerateRandomText(int length)
{
const string valid = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789";
StringBuilder res = new StringBuilder();
Random rnd = new Random();
while (0 < length--)
res.Append(valid[rnd.Next(valid.Length)]);
return res.ToString();
}
/// <summary>
/// 获取图像数字验证码
/// </summary>
/// <param name="text">验证码内容如4为数字</param>
/// <returns></returns>
public static byte[] GetVerifyCode(string text)
{
int width = 128;
int height = 45;
Random random = new();
//创建bitmap位图
using SKBitmap image = new(width, height, SKColorType.Bgra8888, SKAlphaType.Premul);
//创建画笔
using SKCanvas canvas = new(image);
//填充背景颜色为白色
canvas.DrawColor(SKColors.White);
//画图片的背景噪音线
for (int i = 0; i < (width * height * 0.015); i++)
{
using SKPaint drawStyle = new();
drawStyle.Color = new(Convert.ToUInt32(random.Next(Int32.MaxValue)));
canvas.DrawLine(random.Next(0, width), random.Next(0, height), random.Next(0, width), random.Next(0, height), drawStyle);
}
//将文字写到画布上
using (SKPaint drawStyle = new())
{
drawStyle.Color = SKColors.Red;
drawStyle.TextSize = height;
drawStyle.StrokeWidth = 1;
float emHeight = height - (float)height * (float)0.14;
float emWidth = ((float)width / text.Length) - ((float)width * (float)0.13);
canvas.DrawText(text, emWidth, emHeight, drawStyle);
}
//画图片的前景噪音点
for (int i = 0; i < (width * height * 0.6); i++)
{
image.SetPixel(random.Next(0, width), random.Next(0, height), new SKColor(Convert.ToUInt32(random.Next(Int32.MaxValue))));
}
using var img = SKImage.FromBitmap(image);
using SKData p = img.Encode(SKEncodedImageFormat.Png, 100);
return p.ToArray();
}
public static byte[] GenerateCaptchaImage(int width = 100, int height = 40)
{
var random = new Random();
string chars = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789";
string captchaText = "";
for (int i = 0; i < 4; i++) // 生成6个字符的验证码
{
captchaText += chars[random.Next(chars.Length)];
}
return GetVerifyCode(captchaText);
}
}
}