首页 > 其他分享 >.netCore 图形验证码,非System.Drawing.Common

.netCore 图形验证码,非System.Drawing.Common

时间:2023-09-21 11:58:12浏览次数:42  
标签:PointF netCore Color random System Common using new guid

netcore需要跨平台,说白点就是放在windows服务器要能用,放在linux服务器上也能用,甚至macos上。

很多时候需要使用到图形验证码,这就有问题了。

旧方案
1.引入包
<PackageReference Include="System.Drawing.Common" Version="5.0.3" />
2.添加引用
using System.Drawing;
using System.Drawing.Drawing2D;
using System.Drawing.Imaging;
3.在linux上安装libgdiplus
问题在于这个libgdiplus东西非常大,这个东西是moon兼容而来的,而且!!!.net6.0开始不支持这个东西了。

新方案
1.安装包

<PackageReference Include="SixLabors.ImageSharp.Drawing" Version="1.0.0-beta15" />

  


要勾选预览版,不然找不到这个包

2.添加引用

using SixLabors.Fonts;
using SixLabors.ImageSharp;
using SixLabors.ImageSharp.Drawing.Processing;
using SixLabors.ImageSharp.Formats.Jpeg;
using SixLabors.ImageSharp.PixelFormats;
using SixLabors.ImageSharp.Processing;

  


3.生成一个验证码图片

public byte[] CreateByteByImgVerifyCode(string verifyCode, int width, int height)
{

using Image image = new Image<Rgba32>(width, height);
//漆底色白色
image.Mutate(x => x.DrawLines(Pens.DashDot(Color.White, width), new PointF[] { new PointF() { X = 0, Y = 0 }, new PointF() { X = width, Y = height } }));

FontCollection collection = new();
FontFamily family = collection.Add("font/font.ttf");
Font font = family.CreateFont(20, FontStyle.Bold);

PointF startPointF = new PointF(5, 5);
Random random = new Random(); //随机数产生器

Color[] colors = new Color[] { Color.Red, Color.Blue, Color.Green, Color.Purple, Color.Peru, Color.LightSeaGreen, Color.Lime, Color.Magenta, Color.Maroon, Color.MediumBlue, Color.MidnightBlue, Color.Navy };
//绘制大小
for (int i = 0; i < verifyCode.Length; i++)
{
image.Mutate(x => x.DrawText(verifyCode[i].ToString(), font, colors[random.Next(colors.Length)], startPointF));
//Console.WriteLine($"draw code:{verifyCode[i]} point:{startPointF.X}-{startPointF.Y}");
startPointF.X += (int)(width - 10) / verifyCode.Length;
startPointF.Y = random.Next(5, 10);
}

IPen pen = Pens.DashDot(Color.Silver, 1);

//绘制干扰线
for (var k = 0; k < 40; k++)
{
PointF[] points = new PointF[2];
points[0] = new PointF(random.Next(width), random.Next(height));
points[1] = new PointF(random.Next(width), random.Next(height));
image.Mutate(x => x.DrawLines(pen, points));
}


using MemoryStream stream = new MemoryStream();
image.Save(stream, JpegFormat.Instance);
//输出图片流
return stream.ToArray();

}

  

4.在controller中调用它

[HttpGet]
public FileContentResult Code(string guid)
{
try
{
if (String.IsNullOrEmpty(guid))
{
throw new Exception("验证码代码错误,guid不能为空!");
}

//进行特殊符号的替换工作
if (!new System.Text.RegularExpressions.Regex("[0-9,a-z,A-Z]{16}").Match(guid).Success)
{
throw new Exception("guid的位数不足,应为16位随机数,不能包含特殊符号,需要为字母和数字的组合");
}

if (_cache.KeyExits(string.Format(PublicString.CacheImageHead, guid))) { throw new Exception("guid不能重复使用!"); }

//判断guid是否存在

string code = _imgHelper.CreateVerifyCode(ImageHelper.VerifyCodeType.NumberVerifyCode);

_cache.SetString(string.Format(PublicString.CacheImageHead, guid), code, 300);

byte[] codeImage = _imgHelper.CreateByteByImgVerifyCode(code, 80, 36);

return File(codeImage, @"image/jpeg");
}
catch (Exception exl)
{
_logger.LogException(exl);
throw new Exception(exl.Message);
}
}

  

5.随机数计算,缓存帮助类自己实现。
6.新方案不需要安装libgdiplus
7.旧方案占用内存很大,新方案内存消耗很划算
附上一个Dockerfile的文件内容

FROM mcr.microsoft.com/dotnet/aspnet:6.0-alpine AS base
# 安装tzdata
RUN sed -i 's/dl-cdn.alpinelinux.org/mirrors.aliyun.com/g' /etc/apk/repositories
RUN apk add --no-cache tzdata
#RUN apk add libgdiplus --update-cache --repository http://dl-3.alpinelinux.org/alpine/edge/testing/ --allow-untrusted
#RUN apk add terminus-font
# 设置时区
ENV TZ="Asia/Shanghai"
ENV LANG C.UTF-8

FROM base AS final
WORKDIR /app
EXPOSE 80
COPY . .

ENTRYPOINT ["dotnet", "xxx.HttpApi.Host.dll"]

 

当前为草稿,暂未完善

标签:PointF,netCore,Color,random,System,Common,using,new,guid
From: https://www.cnblogs.com/pastespider/p/17719578.html

相关文章

  • systemd path:实时监控文件和目录的变动
    回到Systemd系列文章大纲systemdpath:实时监控文件和目录的变动systemdpath工具提供了监控文件、目录变化并触发执行指定操作的功能。有时候这种监控功能是非常实用的,比如监控到/etc/nginx/nginx.conf或/etc/nginx/conf.d/发生变化后,立即reloadnginx。虽然,用户也可以使用in......
  • systemd timer:取代cron和at的定时任务
    回到Systemd系列文章大纲systemdtimer:取代cron和at的定时任务cron和systemdtimer实现定时任务的比较Linux环境下,cron是使用最广泛的定时任务工具,但它有一些不方便的地方。比如它默认:只支持分钟级别精度的定时任务定时规则太死板当调度到本次任务时,如果上次调度的任务仍......
  • systemd时代的开机启动流程(GPT+systemd)
    回到Systemd系列文章大纲systemd时代的开机启动流程(UEFI+systemd)计算机启动流程可以分为几个大阶段:内核加载前本阶段和操作系统无关,Linux或Windows或其它系统在这阶段的顺序是一样的内核加载中-->内核启动完成内核加载后-->系统环境初始化完成终端加载、用户登录......
  • (建议收藏)OpenHarmony系统能力SystemCapability列表
    SysCap,全称SystemCapability,即系统能力,指操作系统中每一个相对独立的特性。开发者使用某个接口进行开发前,建议先阅读Syscap使用指南,了解Syscap的定义和使用指导。再结合下文中的表格判断具体能力集是否支持某个设备,提高开发效率。说明:Default代表了一个功能比较全面的OpenHarmony设......
  • Ranking Distillation: Learning Compact Ranking Models With High Performance for
    目录概符号说明RankingDistillation代码TangJ.andWangK.RankingDistillation:Learningcompactrankingmodelswithhighperformanceforrecommendersystem.KDD,2018.概在分类问题上,知识蒸馏一般利用最后的logits,本文希望学生和教师对top-K的items的......
  • CommonTK框架之Qt5配置cmake脚本
    源码获取CommonTKCMake配置打开下图的CMake脚本文件添加下面的代码SET(CTK_QT_VERSION5)SET(CMAKE_PREFIX_PATH${CMAKE_PREFIX_PATH}"C:/major/development/tools/qt/5.14/install/5.14./msvc2015_64")添加的脚本代码位置如下图C:/major/development/tools/q......
  • System API——arraycopy
    System.arraycopy(参数1,参数2,参数3,参数4,参数5)参数1:数据源,要拷贝的数据从哪个数组来参数2:从数据源数组中的第几个索引开始拷贝参数3:目的地,要把数据拷贝到哪个数组中参数4:目的地数组的索引参数5:拷贝的个数......
  • 【SystemUI】动态显示或隐藏状态栏及导航栏
    【SystemUI】动态显示或隐藏状态栏及导航栏平台:RK_TAOBAO_356X   Android11需求描述:动态切换状态栏与导航栏的显示或隐藏【解决方案】通过收发广播进行切换;>备注: protected-broadcast 为保护广播,如第三方应用想要接收到系统发送到以下广播,系统需对第三方应......
  • systemd 服务注册
    systemd服务项注册前言systemd是所有进程之母,它负责使Linux主机启动到可以做生产性任务的状态。systemd设定的一些功能比老的初始化程序要广泛得多,它要管理正在运行的Linux主机的许多方面,包括挂载文件系统、管理硬件、处理定时器以及启动和管理生产性主机所需的系统服务......
  • ACL2022 paper1 CAKE: A Scalable Commonsense-Aware Framework for Multi-View Knowl
    CAKE:用于多视域知识图谱补全的可扩展常识感知框架ACL2022Abstract  知识图谱存储大规模事实三元组,然而不可避免的是图谱仍然具有不完整性。(问题)以往的只是图谱补全模型仅仅依赖于事实域数据进行实体之间缺失关系的预测,忽略了宝贵的常识知识。以往的知识图嵌入技术存在无效负......