csharp使用SkiaSharp实现跨平台生成验证码
一.NuGet安装包SkiaSharp:
二.核心代码:
private void GetVerificationCode(int width, int height, int codeLength, float fontSize, int maxPy, out string key, out string value, out MemoryStream memoryStream)
{
Random random = new Random();
key = (DateTime.Now.Ticks + random.Next(0, 100000).ToString()).Substring(4);
value = "";
memoryStream = new MemoryStream();
string codes = "1234567890qwertyuiopasdfghjklzxcvbnmQWERTYUIOPASDFGHJKLZXCVBNM";
for (int i = 0; i < codeLength; i++)
{
value += codes[random.Next(codes.Length)].ToString();
}
using (var surface = SKSurface.Create(new SKImageInfo(width, height)))
{
var canvas = surface.Canvas;
canvas.Clear(SKColors.White);
canvas.Translate(width / 2, height / 2);
for (int i = 0; i < value.Length; i++)
{
double px = - value.Length / 2.0 * fontSize + fontSize * i;
var coord = new SKPoint((int)px, random.Next(maxPy) - maxPy / 2);
var paint = new SKPaint()
{
Color = new SKColor((byte)random.Next(255), (byte)random.Next(255), (byte)random.Next(255)),
IsAntialias = true,
Style = SKPaintStyle.Fill,
TextAlign = SKTextAlign.Center,
TextSize = fontSize,
TextScaleX = (float)random.NextDouble() + 1,
Typeface = SKTypeface.FromFamilyName("Microsoft YaHei", SKFontStyle.Normal)
};
float rr = (float)(random.NextDouble() / 2 - 0.25);
canvas.RotateRadians(rr);
canvas.DrawText(value[i].ToString(), coord, paint);
canvas.RotateRadians(-rr);
}
for (int i = 0;i < width*height/500;i++)
{
var point1 = new SKPoint(random.Next(width)-width/2, random.Next(height)-height/2);
var point2 = new SKPoint(random.Next(width) - width / 2, random.Next(height) - height / 2);
var paint = new SKPaint()
{
Color = new SKColor((byte)random.Next(255), (byte)random.Next(255), (byte)random.Next(255),126),
IsAntialias = true,
Style = SKPaintStyle.Fill,
};
canvas.DrawLine(point1,point2, paint);
}
for (int i = 0; i < width * height / 200; i++)
{
float fx = (float)(random.Next(width) - width / 2);
float fx1 = 2;
float fy = (float)(random.Next(height) - height / 2);
float fy1 = 2;
var paint = new SKPaint()
{
Color = new SKColor((byte)random.Next(255), (byte)random.Next(255), (byte)random.Next(255), 100),
IsAntialias = true,
Style = SKPaintStyle.Fill,
};
canvas.DrawOval(fx, fy,fx1,fy1, paint);
}
using (var image = surface.Snapshot())
{
image.Encode(SKEncodedImageFormat.Png, 80).SaveTo(memoryStream);
}
}
}
三.效果预览: