.net Core 图片验证码 基于SkiaSharp实现
public class ImageCaptcha
{
/// <summary>
/// 干扰线的颜色集合
/// </summary>
private List<SKColor> colors { get; set; }
public ImageCaptcha()
{
colors = new List<SKColor>();
colors.Add(SKColors.AliceBlue);
colors.Add(SKColors.PaleGreen);
colors.Add(SKColors.PaleGoldenrod);
colors.Add(SKColors.Orchid);
colors.Add(SKColors.OrangeRed);
colors.Add(SKColors.Orange);
colors.Add(SKColors.OliveDrab);
colors.Add(SKColors.Olive);
colors.Add(SKColors.OldLace);
colors.Add(SKColors.Navy);
colors.Add(SKColors.NavajoWhite);
colors.Add(SKColors.Moccasin);
colors.Add(SKColors.MistyRose);
colors.Add(SKColors.MintCream);
colors.Add(SKColors.MidnightBlue);
colors.Add(SKColors.MediumVioletRed);
colors.Add(SKColors.MediumTurquoise);
colors.Add(SKColors.MediumSpringGreen);
colors.Add(SKColors.LightSlateGray);
colors.Add(SKColors.LightSteelBlue);
colors.Add(SKColors.LightYellow);
colors.Add(SKColors.Lime);
colors.Add(SKColors.LimeGreen);
colors.Add(SKColors.Linen);
colors.Add(SKColors.PaleTurquoise);
colors.Add(SKColors.Magenta);
colors.Add(SKColors.MediumAquamarine);
colors.Add(SKColors.MediumBlue);
colors.Add(SKColors.MediumOrchid);
colors.Add(SKColors.MediumPurple);
colors.Add(SKColors.MediumSeaGreen);
colors.Add(SKColors.MediumSlateBlue);
colors.Add(SKColors.Maroon);
colors.Add(SKColors.PaleVioletRed);
colors.Add(SKColors.PapayaWhip);
colors.Add(SKColors.PeachPuff);
colors.Add(SKColors.Snow);
colors.Add(SKColors.SpringGreen);
colors.Add(SKColors.SteelBlue);
colors.Add(SKColors.Tan);
colors.Add(SKColors.Teal);
colors.Add(SKColors.Thistle);
colors.Add(SKColors.SlateGray);
colors.Add(SKColors.Tomato);
colors.Add(SKColors.Violet);
colors.Add(SKColors.Wheat);
colors.Add(SKColors.White);
colors.Add(SKColors.WhiteSmoke);
colors.Add(SKColors.Yellow);
colors.Add(SKColors.YellowGreen);
colors.Add(SKColors.Turquoise);
colors.Add(SKColors.LightSkyBlue);
colors.Add(SKColors.SlateBlue);
colors.Add(SKColors.Silver);
colors.Add(SKColors.Peru);
colors.Add(SKColors.Pink);
colors.Add(SKColors.Plum);
colors.Add(SKColors.PowderBlue);
colors.Add(SKColors.Purple);
colors.Add(SKColors.Red);
colors.Add(SKColors.SkyBlue);
colors.Add(SKColors.RosyBrown);
colors.Add(SKColors.SaddleBrown);
colors.Add(SKColors.Salmon);
colors.Add(SKColors.SandyBrown);
colors.Add(SKColors.SeaGreen);
colors.Add(SKColors.SeaShell);
colors.Add(SKColors.Sienna);
colors.Add(SKColors.RoyalBlue);
colors.Add(SKColors.LightSeaGreen);
colors.Add(SKColors.LightSalmon);
colors.Add(SKColors.LightPink);
colors.Add(SKColors.Crimson);
colors.Add(SKColors.Cyan);
colors.Add(SKColors.DarkBlue);
colors.Add(SKColors.DarkCyan);
colors.Add(SKColors.DarkGoldenrod);
colors.Add(SKColors.DarkGray);
colors.Add(SKColors.Cornsilk);
colors.Add(SKColors.DarkGreen);
colors.Add(SKColors.DarkMagenta);
colors.Add(SKColors.DarkOliveGreen);
colors.Add(SKColors.DarkOrange);
colors.Add(SKColors.DarkOrchid);
colors.Add(SKColors.DarkRed);
colors.Add(SKColors.DarkSalmon);
colors.Add(SKColors.DarkKhaki);
colors.Add(SKColors.DarkSeaGreen);
colors.Add(SKColors.CornflowerBlue);
colors.Add(SKColors.Chocolate);
colors.Add(SKColors.AntiqueWhite);
colors.Add(SKColors.Aqua);
colors.Add(SKColors.Aquamarine);
colors.Add(SKColors.Azure);
colors.Add(SKColors.Beige);
colors.Add(SKColors.Bisque);
colors.Add(SKColors.Coral);
colors.Add(SKColors.Black);
colors.Add(SKColors.Blue);
colors.Add(SKColors.BlueViolet);
colors.Add(SKColors.Brown);
colors.Add(SKColors.BurlyWood);
colors.Add(SKColors.CadetBlue);
colors.Add(SKColors.Chartreuse);
colors.Add(SKColors.BlanchedAlmond);
colors.Add(SKColors.Transparent);
colors.Add(SKColors.DarkSlateBlue);
colors.Add(SKColors.DarkTurquoise);
colors.Add(SKColors.IndianRed);
colors.Add(SKColors.Indigo);
colors.Add(SKColors.Ivory);
colors.Add(SKColors.Khaki);
colors.Add(SKColors.Lavender);
colors.Add(SKColors.LavenderBlush);
colors.Add(SKColors.HotPink);
colors.Add(SKColors.LawnGreen);
colors.Add(SKColors.LightBlue);
colors.Add(SKColors.LightCoral);
colors.Add(SKColors.LightCyan);
colors.Add(SKColors.LightGoldenrodYellow);
colors.Add(SKColors.LightGray);
colors.Add(SKColors.LightGreen);
colors.Add(SKColors.LemonChiffon);
colors.Add(SKColors.DarkSlateGray);
colors.Add(SKColors.Honeydew);
colors.Add(SKColors.Green);
colors.Add(SKColors.DarkViolet);
colors.Add(SKColors.DeepPink);
colors.Add(SKColors.DeepSkyBlue);
colors.Add(SKColors.DimGray);
colors.Add(SKColors.DodgerBlue);
colors.Add(SKColors.Firebrick);
colors.Add(SKColors.GreenYellow);
colors.Add(SKColors.FloralWhite);
colors.Add(SKColors.Fuchsia);
colors.Add(SKColors.Gainsboro);
colors.Add(SKColors.GhostWhite);
colors.Add(SKColors.Gold);
colors.Add(SKColors.Goldenrod);
colors.Add(SKColors.Gray);
colors.Add(SKColors.ForestGreen);
}
/// <summary>
/// 创建画笔
/// </summary>
/// <param name="color"></param>
/// <param name="fontSize"></param>
/// <returns></returns>
private SKPaint CreatePaint(SKColor color, float fontSize)
{
SkiaSharp.SKTypeface font = SKTypeface.FromFamilyName(null, SKFontStyleWeight.SemiBold, SKFontStyleWidth.ExtraCondensed, SKFontStyleSlant.Upright);
SKPaint paint = new SKPaint();
paint.IsAntialias = true;
paint.Color = color;
paint.Typeface = font;
paint.TextSize = fontSize;
return paint;
}
/// <summary>
/// 获取验证码
/// </summary>
/// <param name="captchaText">验证码文字</param>
/// <param name="width">图片宽度</param>
/// <param name="height">图片高度</param>
/// <param name="lineNum">干扰线数量</param>
/// <param name="lineStrookeWidth">干扰线宽度</param>
/// <returns></returns>
public byte[] GetCaptcha(string captchaText,int width,int height,int lineNum=,int lineStrookeWidth=)
{
//创建bitmap位图
using (SKBitmap image2d = new SKBitmap(width, height, SKColorType.Bgra8888, SKAlphaType.Premul))
{
//创建画笔
using (SKCanvas canvas = new SKCanvas(image2d))
{
//填充背景颜色为白色
canvas.DrawColor(SKColors.White);
//将文字写到画布上
using (SKPaint drawStyle = CreatePaint(SKColors.Black, height))
{
canvas.DrawText(captchaText, , height-, drawStyle);
}
//画随机干扰线
using (SKPaint drawStyle = new SKPaint())
{
Random random = new Random();
for (int i = ; i < lineNum; i++)
{
drawStyle.Color = colors[random.Next(colors.Count)];
drawStyle.StrokeWidth = lineStrookeWidth;
canvas.DrawLine(random.Next(,width), random.Next(, height), random.Next(, width), random.Next(, height), drawStyle);
}
}
//返回图片byte
using (SKImage img = SKImage.FromBitmap(image2d))
{
using (SKData p = img.Encode(SKEncodedImageFormat.Png, ))
{
return p.ToArray();
}
}
}
}
} }
仅做记录
.net Core 图片验证码 基于SkiaSharp实现的更多相关文章
- dotnet Core 图片验证码
9102年了,.NET Core 2.x已经稳定,但是还是有很多人搞不定.NET Core的图片验证码. 下面说重点 1.引用Nuget包:System.Drawing.Common 2.像NET F ...
- asp.net core 图片验证码,后台验证
验证方法: public static string VerificationCodeCacheFormat="vcode_cache_{0}"; public IActionRe ...
- 基于spring mvc的图片验证码实现
本文实现基于spring mvc的图片验证码,分后台代码和前端页面的展现以及验证码的验证. 首看后台实现代码: @RequestMapping({"authCode"}) publ ...
- 使用.Net Core 2.1开发Captcha图片验证码服务
更新后续篇:Captcha服务(后续1) 使用.Net Core 2.1开发Captcha验证码服务 开发工具:Visual Studio 2017 15.7.3 开发平台:64位 Windows 1 ...
- 【原创】基于phpGrace+uniApp开发之:5.登录界面增加图片验证码
1.目的: 采用phpGrace中的图片验证码,在用户名+密码登录时使用图片验证码进行验证. 2.文档地址: 图片验证码的文档地址:http://www.phpgrace.com/tools/info ...
- [Asp.Net Core] 为什么选择 Blazor Server Side (一) 快速实现图片验证码
关于Blazor 由于在国内, Blazor一点都不普及, 建议读者翻看我之前写的随笔, 了解Blazor Server Side的特点. 在一段时间内, 我会写一些解说分析型的 "为什么选 ...
- 【Spring】基于SpringMVC的图片验证码功能实现
后台实现代码: ImgController.java 文件 package cn.shop.controller; import java.awt.Color; import java.awt.Fon ...
- 字符型图片验证码识别完整过程及Python实现
字符型图片验证码识别完整过程及Python实现 1 摘要 验证码是目前互联网上非常常见也是非常重要的一个事物,充当着很多系统的 防火墙 功能,但是随时OCR技术的发展,验证码暴露出来的安全问题也越 ...
- Spingmvc项目注册登录图片验证码(比较灵活的验证码)
最近项目中注册模块要加一个图片验证码功能. 写下来记录下. 1:首先用什么实现,我用的servlet. 后台java代码:RandomValidateCode 类 ,这个类是生成随即验证码和干扰线,可 ...
随机推荐
- unigui图形验证码
unigui图形验证码 procedure TMainForm.UniButton1Click(Sender: TObject); var url: SockString; serial: TynSe ...
- Job for keepalived.service failed because the control process exited with error code. See "systemctl status keepalived.service" and "journalctl -xe" for details.
解决方案 https://blog.csdn.net/zt15732625878/article/details/86493096
- CloudFlare 新手入门中文教程
loudFlare成立于2009年,是国外著名的免费CDN网站加速服务公司,CloudFlare 还提供实时安全保护服务和网络优化等,采用的是免费+增值模式,可以免费使用,也有收费服务.国内也有很多免 ...
- Linux嵌入式学习过程(转载)
嵌入式专业是一门实践性非常强的学科,只有多动手,多实践,多编程,多调试,多看书,多思考才能真正掌握好嵌入式开发技术.那么,如何从零开始学习嵌入式开发技术, 进入嵌入式开发大门呢,笔者根据自己的嵌入式学 ...
- 连接池中的maxIdle,MaxActive,maxWait参数
连接池中的maxIdle,MaxActive,maxWait参数 线程池 name:表示你的连接池的名称也就是你要访问连接池的地址 auth:是连接池管理权属性,Container表示容器管理 typ ...
- mongodb and 和 or 查询
db.getCollection('gxyWarnEntity').find({ "schoolId" : "f11c8ea12f457dbc19c768a8bb6357 ...
- 生命周期和Zend引擎
一切的开始:SAPI接口 SAPI(Server Application Programming Interface)指的是具体应用的编程接口.PHP脚本要执行有很多种方式,通过web服务器,或者直接 ...
- golang web框架设计2:自定义路由
继续学习谢大的Go web框架设计 HTTP路由 http路由负责将一个http的请求交到对应的函数处理(或者一个struct的方法),路由在框架中相当于一个事件处理器,而这个时间包括 用户请求的路径 ...
- smoothstep(),平滑阶梯函数,平滑过渡函数【转】
函数定义: 参考:https://en.wikipedia.org/wiki/Smoothstep 相关函数图形如下: 计算机图形中经常用到正如上图所示的:两个smooth()函数相减. 相关C+ ...
- Reactor系列(六)Exception异常系列(六)Exception异常
#java##reactor##flux##error##exception# 视频解说: https://www.bilibili.com/video/av79468713/ FluxMonoTes ...