86 lines
3.0 KiB
C#
86 lines
3.0 KiB
C#
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);
|
||
}
|
||
}
|
||
}
|