.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 类 ,这个类是生成随即验证码和干扰线,可 ...
随机推荐
- OS X的CAOpenGLLayer中如何启用OpenGL3.2 core profile
在OS X的openGL编程中,我们有时为了想在自己的OpenGL图层上再加些自己的某些涂层,必须得用CAOpenGLLayer而不是NSOpenGLView,由于在NSOpenGLView上添加任何 ...
- Django - ORM - 事务, 乐观锁, 悲观锁
事务 概念 Transaction 事务:一个最小的不可再分的工作单元:通常一个事务对应一个完整的业务(例如银行账户转账业务,该业务就是一个最小的工作单元) 一个完整的业务需要批量的DML(inser ...
- 十个Python爬虫武器库示例,十个爬虫框架,十种实现爬虫的方法!
一般比价小型的爬虫需求,我是直接使用requests库 + bs4就解决了,再麻烦点就使用selenium解决js的异步 加载问题.相对比较大型的需求才使用框架,主要是便于管理以及扩展等. 1.Scr ...
- 001-多线程-JUC集合-框架概述
一.概述 1.1.java集合 java集合的架构,主体内容包括Collection集合和Map类:而Collection集合又可以划分为List(队列)和Set(集合). 1. List的实现类主要 ...
- css中em小于1时chrome字体大小和firefox字体大小不一致的问题
css中em设置为0.8,结果页面显示,chrome字体比firefox字体大了不少. chrome有默认字体大小,默认为12px.设置的字体大小小于12px时,也是按照12px来显示. firefo ...
- jdk8环境下sprngboot/springmvc中JSR310新日期/时间类LocalDateTime显示效果带T
如图所示: 日期时间类中带了一个T,以上这种格式LocalDateTime格式化的时候默认日期时间格式:ISO.DATE_TIME(按笔者目前的知识理解是ISO8601规范中的日期时间格式化) 想要把 ...
- iOS面试-堆和栈的区别
堆和栈的区别: 一.堆栈空间分配区别: 1.栈(操作系统):由操作系统自动分配释放 ,存放函数的参数值,局部变量的值等.其操作方式类似于数据结构中的栈: 2.堆(操作系统): 一般由程序员分配释放, ...
- swift 第十三课 GCD 的介绍和使用
手头的项目中基本没有用到这个,但是还是要探索下.毕竟好多的地方要用这个,而且现在手机和电脑等电子设备都是多核心的,这样就成就了多线程带来更加优越的用户体验. 先记录下,自己看到的两个不错的连接: ht ...
- windows下配置tomcat服务器的jvm内存大小的两种方式
难得遇到一次java堆内存溢出(心里想着,终于可以来一次jvm性能优化了$$) 先看下报错信息, java.lang.OutOfMemoryError: GC overhead limit excee ...
- c# CefSharp
一. CefSharp简单来说就是一款.Net编写的浏览器包,方便你在Winform和WPF中内嵌的Chrome浏览器组件. https://github.com/cefsharp/CefSharp ...