最新要闻

广告

手机

iphone11大小尺寸是多少?苹果iPhone11和iPhone13的区别是什么?

iphone11大小尺寸是多少?苹果iPhone11和iPhone13的区别是什么?

警方通报辅警执法直播中被撞飞:犯罪嫌疑人已投案

警方通报辅警执法直播中被撞飞:犯罪嫌疑人已投案

家电

AspNet Core MVC项目接入的登录页验证码(一)

来源:博客园

背景

在.NET Framework 框架下生成图片验证码时,使用的是System.Drawing,但它却只是 Win32 GDI+ 的一层很薄很薄的封装,在其他平台上没有原生对 GDI+ 的实现。

将框架从 .NET Framework 迁移到 .NET Core 后,需要重新选择新的图片处理组件,于是对 .NET Core 下常见的解决方案进行了实现,测试了性能。


(资料图片)

验证码实现方式

1.System.Drawing.Common微软提供用的 System.Drawing.Common ,代码上基本上不需要修改。但是在非windows 系统时需要 libgdiplus 支持,libgdiplus是mono跨平台项目的对GDI+的跨平台实现。

最新版本的 System.Drawing.Common 已经不支持非window平台了,此次使用了5.0.3版本。

在linux下需要安装 libgdiplus ,在 Dokcerfile 中的添加安装脚本。

RUN apt-get update -y && apt-get install -y apt-utilsRUN apt-get install -y libgdiplus && apt-get install -y libc6-dev

2.SixLabors.ImageSharp开源的图片处理库,完全采用C#实现,基本上兼容所有平台。但是他的绘图依赖 SixLabors.ImageSharp.Drawing 从2017到现在一直处于预览版。https://github.com/SixLabors/ImageSharp

3.SkiaSharp开源图片处理库,基于Google 的 Skia实现,兼容服务、桌面、移动等多种平台。针对不同的平台提供的对应的 NativeAssets 包。

https://github.com/mono/SkiaSharp

测试时生成图片的格式都设置为 jpeg ,图片质量都设置为75,输出的为base64。

100次耗时200次耗时300次耗时base64长度
System.Drawing (win)00.033055300.078989800.13499372578
SixLabors.ImageSharp (win)00.455211301.048591101.52900782808
SkiaSharp (win)00.037875200.082289100.11094862161
System.Drawing (linux)00.031433100.044951700.07481792649
SixLabors.ImageSharp (linux)00.649084101.115560301.79467872805
SkiaSharp (linux)00.035963400.072241200.12508672155

Linux 下的测试基于 Docker

按性能排序 System.Drawing > SkiaSharp > SixLabors.ImageSharp

  • System.Drawing 不管是Window平台还是Linux平台,性能都是最好的,并且在Linux下速度更快。
  • SkiaSharp 因为底层使用的还是C++的库,所以整体性能也非常不错,与 System.Drawing 非常接近。
  • SixLabors.ImageSharp 因为是纯C#原生实现,所以性能是最差的,耗时非常长。

三种方案生成的图片尺寸差距不大,从兼容性和支持上看,建议优先选择 SkiaSharp。 System.Drawing 虽然性能最好但微软已经明确不再支持非Windows平台,性能优势虽然还是比较明显,但针对当前的验证码场景,耗时差异非常小。

来源:https://tech.uupt.com/?p=777

关键词: