1. NetCore ZKweb
在我第一次绘制图形验证码时是采用的ZKweb的绘制库,奉上代码参考
public byte[] GetVerifyCode(out string code)
{
code = string.Empty;
int codeW = ;
int codeH = ;
int fontSize = ;
string chkCode = string.Empty;
Random rnd = new Random();
//颜色列表,用于验证码、噪线、噪点
System.DrawingCore.Color[] color = { Color.Black, Color.Red, Color.Blue, Color.Green, Color.Orange, Color.Brown, Color.Brown, Color.DarkBlue };
//字体列表,用于验证码
string[] font = { "Times New Roman" };
//验证码的字符集,去掉了一些容易混淆的字符
char[] character = { '', '', '', '', '', '', '', 'a', 'b', 'd', 'e', 'f', 'h', 'k', 'm', 'n', 'r', 'x', 'y', 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'J', 'K', 'L', 'M', 'N', 'P', 'R', 'S', 'T', 'W', 'X', 'Y' };
//生成验证码字符串
for (int i = ; i < ; i++)
{
chkCode += character[rnd.Next(character.Length)];
}
code = chkCode; //创建画布
Bitmap bmp = new Bitmap(codeW, codeH);
Graphics g = Graphics.FromImage(bmp);
g.Clear(Color.White);
//画噪线
for (int i = ; i < ; i++)
{
int x1 = rnd.Next(codeW);
int y1 = rnd.Next(codeH);
int x2 = rnd.Next(codeW);
int y2 = rnd.Next(codeH);
Color clr = color[rnd.Next(color.Length)];
g.DrawLine(new Pen(clr), x1, y1, x2, y2);
}
//画验证码字符串
for (int i = ; i < chkCode.Length; i++)
{
string fnt = font[rnd.Next(font.Length)];
Font ft = new Font(fnt, fontSize);
Color clr = color[rnd.Next(color.Length)];
g.DrawString(chkCode[i].ToString(), ft, new SolidBrush(clr), (float)i * , (float));
}
//将验证码图片写入内存流,并将其以 "image/Png" 格式输出
MemoryStream ms = new MemoryStream();
try
{
bmp.Save(ms, ImageFormat.Png);
return ms.ToArray();
}
catch (Exception)
{
return null;
}
finally
{
g.Dispose();
bmp.Dispose();
}
}
这个开始用的还不错,但是今天更新了VS到15.7版这个就产生了一个很恶心的问题,ZKweb的引用库和项目自带的Core.All好几个dll冲突,这两个一个是ZKweb的依赖库一个是项目的依赖库 都没法重新引用,百度了很久后决定放弃ZKweb.改用SkiaSharp
2. SkiaSharp
这个百度上的搜索结果没有一个是给了可用代码的。ε=(´ο`*)))唉 而且大部分都是一个人放出来的代码 好吧开始自己整。先上代码
public IActionResult Code()
{
#region 反射SK支持的全部颜色
//List<SKColor> colors = new List<SKColor>();
//var skcolors = new SKColors();
//var type = skcolors.GetType();
//foreach (FieldInfo field in type.GetFields())
//{
// colors.Add( (SKColor)field.GetValue(skcolors));
//}
#endregion //int maxcolorindex = colors.Count-1;
string text = "1A3V";
var zu = text.ToList();
SKBitmap bmp = new SKBitmap(, );
using (SKCanvas canvas = new SKCanvas(bmp))
{
//背景色
canvas.DrawColor(SKColors.White); using (SKPaint sKPaint = new SKPaint())
{
sKPaint.TextSize = ;//字体大小
sKPaint.IsAntialias = true;//开启抗锯齿
sKPaint.Typeface = SKTypeface.FromFamilyName("微软雅黑", SKTypefaceStyle.Bold);//字体
SKRect size = new SKRect();
sKPaint.MeasureText(zu[].ToString(), ref size);//计算文字宽度以及高度 float temp = (bmp.Width/ - size.Size.Width)/;
float temp1 = bmp.Height - (bmp.Height - size.Size.Height) / ;
Random random = new Random(); for (int i = ; i < ; i++)
{ sKPaint.Color = new SKColor((byte)random.Next(,), (byte)random.Next(, ), (byte)random.Next(, ));
canvas.DrawText(zu[i].ToString(), temp + *i, temp1, sKPaint);//画文字
}
//干扰线
for (int i = ; i < ; i++)
{
sKPaint.Color = new SKColor((byte)random.Next(, ), (byte)random.Next(, ), (byte)random.Next(, ));
canvas.DrawLine(random.Next(, ), random.Next(, ), random.Next(, ), random.Next(, ), sKPaint);
}
}
//页面展示图片
using (SKImage img = SKImage.FromBitmap(bmp))
{
using (SKData p = img.Encode())
{
return File(p.ToArray(), "image/Png");
}
}
}
}
这个最大的好处不依赖任何库,不用担心和core自身的dll冲突问题,SkiaSharp的功能还不只这些 英文水平有限好多属性我没没搞明白是什么,比如如何内容旋转啥的 呵呵。。 先记录这些