在开发中,有时候生成验证码的场景目前还是存在的,本篇演示不依赖第三方组件,生成随机验证码图片。

先添加验证码接口

public interface ICaptcha
{
/// <summary>
/// 生成随机验证码
/// </summary>
/// <param name="codeLength"></param>
/// <returns></returns>
Task<string> GenerateRandomCaptchaAsync(int codeLength = 4); /// <summary>
/// 生成验证码图片
/// </summary>
/// <param name="captchaCode">验证码</param>
/// <param name="width">宽为0将根据验证码长度自动匹配合适宽度</param>
/// <param name="height">高</param>
/// <returns></returns>
Task<CaptchaResult> GenerateCaptchaImageAsync(string captchaCode, int width = 0, int height = 30);
}

验证码返回模型

public class CaptchaResult
{
/// <summary>
/// CaptchaCode
/// </summary>
public string CaptchaCode { get; set; } /// <summary>
/// CaptchaMemoryStream
/// </summary>
public MemoryStream CaptchaMemoryStream { get; set; } /// <summary>
/// Timestamp
/// </summary>
public DateTime Timestamp { get; set; }
}

接下来实现接口,主要是依赖微软的System.Drawing.Common组件,注意命名空间的引用

public class Captcha : ICaptcha
{
private const string Letters = "1,2,3,4,5,6,7,8,9,A,B,C,D,E,F,G,H,J,K,L,M,N,P,Q,R,S,T,U,V,W,X,Y,Z"; public Task<CaptchaResult> GenerateCaptchaImageAsync(string captchaCode, int width = 0, int height = 30)
{
//验证码颜色集合
Color[] c = { Color.Black, Color.Red, Color.DarkBlue, Color.Green, Color.Orange, Color.Brown, Color.DarkCyan, Color.Purple }; //验证码字体集合
string[] fonts = { "Verdana", "Microsoft Sans Serif", "Comic Sans MS", "Arial" }; //定义图像的大小,生成图像的实例
var image = new Bitmap(width == 0 ? captchaCode.Length * 25 : width, height); var g = Graphics.FromImage(image); //背景设为白色
g.Clear(Color.White); var random = new Random(); for (var i = 0; i < 100; i++)
{
var x = random.Next(image.Width);
var y = random.Next(image.Height);
g.DrawRectangle(new Pen(Color.LightGray, 0), x, y, 1, 1);
} //验证码绘制在g中
for (var i = 0; i < captchaCode.Length; i++)
{
//随机颜色索引值
var cindex = random.Next(c.Length); //随机字体索引值
var findex = random.Next(fonts.Length); //字体
var f = new Font(fonts[findex], 15, FontStyle.Bold); //颜色
Brush b = new SolidBrush(c[cindex]); var ii = 4;
if ((i + 1) % 2 == 0)
ii = 2; //绘制一个验证字符
g.DrawString(captchaCode.Substring(i, 1), f, b, 17 + (i * 17), ii);
} var ms = new MemoryStream();
image.Save(ms, ImageFormat.Png); g.Dispose();
image.Dispose(); return Task.FromResult(new CaptchaResult
{
CaptchaCode = captchaCode,
CaptchaMemoryStream = ms,
Timestamp = DateTime.Now
});
} public Task<string> GenerateRandomCaptchaAsync(int codeLength = 4)
{
var array = Letters.Split(new[] { ',' }); var random = new Random(); var temp = -1; var captcheCode = string.Empty; for (int i = 0; i < codeLength; i++)
{
if (temp != -1)
random = new Random(i * temp * unchecked((int)DateTime.Now.Ticks)); var index = random.Next(array.Length); if (temp != -1 && temp == index)
return GenerateRandomCaptchaAsync(codeLength); temp = index; captcheCode += array[index];
} return Task.FromResult(captcheCode);
}
}

在控制器中注入调用

[Route("api/[controller]")]
[ApiController]
public class CaptchaController : ControllerBase
{
[HttpGet]
public async Task<FileContentResult> CaptchaAsync([FromServices] ICaptcha _captcha)
{
var code = await _captcha.GenerateRandomCaptchaAsync(); var result = await _captcha.GenerateCaptchaImageAsync(code); return File(result.CaptchaMemoryStream.ToArray(), "image/png");
}
}

gitee地址:https://gitee.com/xuzhongye/GenerateVerificationCodeDemo.git

.NET Core 中生成验证码的更多相关文章

  1. java中生成验证码,以及验证码的使用

    java中生成验证码,以及验证码的使用: 1:验证码生成工具类: import java.awt.Color; import java.awt.Font; import java.awt.Graphi ...

  2. servlet中生成验证码

    在servlet中生成验证码 package login; import java.awt.Color; import java.awt.Graphics; import java.awt.image ...

  3. JAVA WEB项目中生成验证码及验证实例(附源码及目录结构)

    [我是一个初学者,自己总结和网上搜索资料,代码是自己敲了一遍,亲测有效,现将所有的目录结构和代码贴出来分享给像我一样的初学者] 作用 验证码为全自动区分计算机和人类的图灵测试的缩写,是一种区分用户是计 ...

  4. PHP中生成验证码

    //生成图片$im = imagecreatetruecolor(100,30);//生成颜色,当第一次调用生成颜色的方法,是生成背景颜色,默认是黑色//如果想自定义背景颜色,用到imagefill函 ...

  5. .Net Core 中使用PetaPoco ,T4生成模版

    话不多说,直接上源码. 1.引用NuGet 2.添加T4 <#@ template debug="true" hostspecific="false" l ...

  6. Java生成验证码原理(jsp)

     验证码的作用: 验证码是Completely Automated Public Turing test to tell Computers and Humans Apart(全自动区分计算机和人类的 ...

  7. ASP.NET Core中使用表达式树创建URL

    当我们在ASP.NET Core中生成一个action的url会这样写: var url=_urlHelper.Action("Index", "Home"); ...

  8. 详细说说如何生成验证码—ASP.NET细枝末节(4)

    前言 今天小编详细的说一下,ASP.NET网站开发过程中生成验证码的全部问题. 本文的目标,是让读者了解,生成验证码涉及的全部基础知识问题. 当然这里说的是比较简单的验证码. 真正符合要求的验证码,涉 ...

  9. node.js生成验证码及图片

    示例代码: var svgCaptcha = require('svg-captcha'); var fs = require('fs'); var codeConfig = { size: 5,// ...

  10. 务必收藏备用:.net core中通过Json或直接获取图形验证码(数字验证码、字母验证码、混合验证码),有源代码全实战demo(开源代码.net core3.0)

    很多人写的博客大家看了会一知半解,不知道怎么用,应该引用什么类库或者代码不全,这样很多小白很是头疼,尤其是尝新技术更是如此.我们这边不止告诉你步骤,而且还提供开源demo.随着时间的推移,我们的dem ...

随机推荐

  1. Azure 无服务器 Function 函数计算服务 dotnet core 3.1 创建和部署入门

    本文用的是 世纪互联 的 Azure.cn 版本,这个版本因为是在国内,所以网速会快超级超级多.使用 世纪互联 的版本需要一块钱哦,用一块钱就能进入一个月的免费试用.本文主要告诉小伙伴如何使用 Azu ...

  2. 2019-2-21-PowerShell-通过-WMI-获取补丁

    title author date CreateTime categories PowerShell 通过 WMI 获取补丁 lindexi 2019-02-21 20:39:51 +0800 201 ...

  3. C++ 多级继承与多重继承:代码组织与灵活性的平衡

    C++ 多级继承 多级继承是一种面向对象编程(OOP)特性,允许一个类从多个基类继承属性和方法.它使代码更易于组织和维护,并促进代码重用. 多级继承的语法 在 C++ 中,使用 : 符号来指定继承关系 ...

  4. 一些有用的css函数

    var 使用自定义的属性值. :root { --main-bg-color: pink; } body { background-color: var(--main-bg-color); } att ...

  5. CF1097C Yuhao and a Parenthesis

    CF1097C Yuhao and a Parenthesis stl 乱搞做法,感觉比正解更直接. 每个字符串内部能匹配的尽可能匹配. 匹配完成后,检验剩余序列是否只含有 ( 或只含有 ) 或为空, ...

  6. Competition Set - AtCoder II

    这里记录的是这个账号的比赛情况. ABC310 2023-7-15 Solved:6/8 1973->2053 七场ABC,两场打得蛮烂的,都因为AT炸掉Unrated了:另外五场全部满Perf ...

  7. 通过劫持线程arena实现任意地址分配 n1ctf2018_null

    通过劫持线程arena,当堆开了一个线程之后,如果没有做好保护随之的危险也悄然而至 BUU上的n1ctf2018_null很好的说明了这个问题 题目链接:BUUCTF在线评测 (buuoj.cn) 看 ...

  8. three.js教程5-几何体顶点UV坐标、纹理贴图TextureLoader

    1.纹理贴图 纹理贴图,是给MeshLambertMaterial等材质一些纹理图片,以达到更好的视觉效果. 使用方法:通过纹理贴图加载器TextureLoader的load()方法加载一张图片可以返 ...

  9. 小程序 image 高度自适应及裁剪问题

    在做微信小程序的商品详情页,商品的详情是图片集合,渲染完成后发现图片加载的很不自然,后来我把样式设置宽度 100%,并对 image 组件添加属性 mode="widthFix"解 ...

  10. 版本管理工具 nvm WIN版

    nvm -h //查看nvm的指令 nvm list //查看本地已经安装的node版本列表 nvm list available //查看可以安装的node版本 nvm install latest ...