今天大家分享的是一个专注于NetCore平台图像处理的开源项目,老实说为这篇文章取名字想了5分钟,可能是词穷亦或是想更好的表达出这款开源项目的作用;这个项目在图像处理方面有很多功能,如:缩放,裁剪,绘画,组合图片等;今天主要讲的是用她怎么来绘图和生成验证码的实际例子。

号外:近来淘宝服装小店进了批新货,有需要购衣的朋友可以来看看,地址在文章最下方。

  • 简单介绍ImageSharp

  • 试试画两条线(实线和虚线)

  • 生成个缩略图

  • 在图片上画字

  • 制作一个验证码图片

  • 结合RazorPage模板,展示验证码图片

简单介绍ImageSharp

ImageSharp是对NetCore平台扩展的一个图像处理方案,在写下本文为止它最新的nuget下载量为4,034次,作者团队最近一个月刚更新的包;没错这里说最新是因为她前身和之前的版本都很受欢迎下载量也超高;她的git项目地址:https://github.com/SixLabors/ImageSharp。如果您的项目和我一样是2.0版本(2.0以前的略过),那么直接可以通过vs的nuget控制台下载对应的包,注意绘图的话需要分别下载如下两个包:

Install-Package SixLabors.ImageSharp -Version 1.0.0-beta0001

Install-Package SixLabors.ImageSharp.Drawing -Version 1.0.0-beta0001

ImageSharp用法有朋友之前写过,不过都主要针对于之前的版本,本章主要用到的都是最新的,有部分写法可能不相同。

试试画两条线(实线和虚线)

这里将用她来画两条直线并保存成图片,主要起到一个介绍作用,先来看实线如下代码:

var path = @"D:\F\学习\vs2017\netcore\Study.AspNetCore\WebApp02-1\wwwroot\images";            //默认实线using (Image<Rgba32> image = new Image<Rgba32>(500, 500))   //画布大小            {image.Mutate(x => x.BackgroundColor(Rgba32.WhiteSmoke).   //画布背景                            DrawLines(Rgba32.HotPink, //字体颜色5,   //字体大小new SixLabors.Primitives.PointF[]{                                    new Vector2(10, 10),                                    new Vector2(200, 150),                                    new Vector2(50, 300)} //两点一线坐标                        ));image.Save($"{path}/1.png"); //保存}

总要步骤我都备注上文字了,这里主要通过两点一线来绘制图形,Vector2对象值得注意就是C#二维坐标(x,y)对象,其实除了Vector2还有Vector3(三维坐标)等,这对于做u3d的朋友来说不会陌生,老实说这个也是我在接触u3d时候才知道有这个类的。下面来看效果图:

由两个两点一线构造的一个角,下面来看下虚线绘制:

//虚线using (Image<Rgba32> image = new Image<Rgba32>(500, 500))   //画布大小            {image.Mutate(x => x.BackgroundColor(Rgba32.WhiteSmoke).   //画布背景                            DrawLines(Pens.Dash(Rgba32.HotPink, 5),   //字体大小new SixLabors.Primitives.PointF[]{                                    new Vector2(10, 10),                                    new Vector2(200, 150),                                    new Vector2(50, 300)} //两点一线坐标                        ));image.Save($"{path}/2.png"); //保存}

步骤都差不多,只是调用了DrawLines的扩展方法而已,其他线条例子就不多说了各位自行实验。

生成个缩略图和在图片上画字

对于图片类型的网站来说缩略图是常见的,这里用ImageSharp生成缩略图很简单,本实例用8.png做样本来生成缩略图8-1.png,直接看例子如下是netstandard 1.3+的例子:

 //缩略图using (Image<Rgba32> image = Image.Load($"{path}/8.png")){image.Mutate(x => x.Resize(image.Width / 2, image.Height / 2));image.Save($"{path}/8-1.png");}

为了更好的对比缩略图和原图的区别这里对接拿两图的属性做对比如:

能很好的看出缩略图文件大小和像素都减半了,实际缩略的时候不一定减半,这全由参数控制Resize(width,height);

画字:在图片上画我们想要的字,其实类似于水印的一种需求,下面是在图片上画字的代码:

//画字 var install_Family = new FontCollection().Install(System.IO.Path.Combine(Directory.GetCurrentDirectory(), "wwwroot/bak", "STKAITI.TTF")                //@"C:\Windows\Fonts\STKAITI.TTF"   //字体文件                );            var font = new Font(install_Family, 50);  //字体using (Image<Rgba32> image = Image.Load($"{path}/8.png")){image.Mutate(x => x.DrawText(                        "你们好,我是神牛",   //文字内容                         font,Rgba32.HotPink,                         new Vector2(50, 150),TextGraphicsOptions.Default));image.Save($"{path}/8-2.png");}

这里用ImageSharp在图片上画字的时候需要注意:字体,因为windows系统自带了字体问题这里以STKAITI.TTF字体文件为例,它存储于 C:\Windows\Fonts\STKAITI.TTF 目录,当然您可以直接把它拷贝到我们项目中如下我这里的例子一样做法(这里只测试了windows下可用,尚未测试linux下直接使用该字体文件是否可行);

制作一个验证码图片

下面我们将用她来画一个验证码类型的图片,通常验证码都有一些点和线来干扰,上面已经有画线例子了,这里展示怎么画点:

//画点(规则的点,其他的各位自行写算法) var dianWith = 1; //点宽度var xx = 300;  //图片宽度var yy = 200;  //图片高度var xx_space = 10;  //点与点之间x坐标间隔var yy_space = 5;    //y坐标间隔var listPath = new List<IPath>();            for (int i = 0; i < xx / xx_space; i++){                for (int j = 0; j < yy / yy_space; j++){                    var position = new Vector2(i * xx_space, j * yy_space);                    var linerLine = new LinearLineSegment(position, position);                    var shapesPath = new SixLabors.Shapes.Path(linerLine);listPath.Add(shapesPath);}}            using (Image<Rgba32> image = new Image<Rgba32>(xx, yy))   //画布大小            {image.Mutate(x => x.BackgroundColor(Rgba32.WhiteSmoke).   //画布背景                            Draw(Pens.Dot(Rgba32.HotPink, dianWith),   //大小new SixLabors.Shapes.PathCollection(listPath)  //坐标集合                        ));image.Save($"{path}/9.png"); //保存}

这里直接利用IImageProcessingContext<TPixel>扩展方法Draw来绘制有规则的点,如图所示:

比较单调,或许您们能做的更好看些;下面来做验证码图片,主要由:画点+画字=验证码图片,这里我封装了一个方法直接生成验证码图片:

/// <summary>/// 画点+画字=验证码图片  /// </summary>/// <param name="content">验证码</param>/// <param name="outImgPath">输出图片路径</param>/// <param name="fontFilePath">字体文件</param>/// <param name="x">图片宽度</param>/// <param name="y">图片高度</param>public void GetValidCode(                    string content = "我是神牛",                    string outImgPath = "D:/F/学习/vs2017/netcore/Study.AspNetCore/WebApp02-1/wwwroot/images/10.png",                    string fontFilePath = @"D:\F\学习\vs2017\netcore\Study.AspNetCore\WebApp02-1\wwwroot\bak\STKAITI.TTF",                    int xx = 150, int yy = 25){            var dianWith = 1; //点宽度var xx_space = 10;  //点与点之间x坐标间隔var yy_space = 5;    //y坐标间隔var wenZiLen = content.Length;  //文字长度var maxX = xx / wenZiLen; //每个文字最大x宽度var prevWenZiX = 0; //前面一个文字的x坐标var size = 16;//字体大小            //字体var install_Family = new FontCollection().Install(fontFilePath              //@"C:\Windows\Fonts\STKAITI.TTF"   //windows系统下字体文件              );            var font = new Font(install_Family, size);  //字体            //点坐标var listPath = new List<IPath>();            for (int i = 0; i < xx / xx_space; i++){                for (int j = 0; j < yy / yy_space; j++){                    var position = new Vector2(i * xx_space, j * yy_space);                    var linerLine = new LinearLineSegment(position, position);                    var shapesPath = new SixLabors.Shapes.Path(linerLine);listPath.Add(shapesPath);}}            //画图using (Image<Rgba32> image = new Image<Rgba32>(xx, yy))   //画布大小            {image.Mutate(x =>{                    //画点var imgProc = x.BackgroundColor(Rgba32.WhiteSmoke).   //画布背景                              Draw(Pens.Dot(Rgba32.HotPink, dianWith),   //大小new SixLabors.Shapes.PathCollection(listPath)  //坐标集合                          );                    //逐个画字for (int i = 0; i < wenZiLen; i++){                        //当前的要输出的字var nowWenZi = content.Substring(i, 1);                        //文字坐标var wenXY = new Vector2();                        var maxXX = prevWenZiX + (maxX - size);wenXY.X = new Random().Next(prevWenZiX, maxXX);wenXY.Y = new Random().Next(0, yy - size);prevWenZiX = Convert.ToInt32(Math.Floor(wenXY.X)) + size;                        //画字                        imgProc.DrawText(nowWenZi,   //文字内容                           font,i % 2 > 0 ? Rgba32.HotPink : Rgba32.Red,wenXY,TextGraphicsOptions.Default);}});                //保存到图片                image.Save(outImgPath);}}

通过简单的调用 GetValidCode("我是神牛");return Page(); 能得到如图验证码图片的效果:

文字看起来好像在点的前面,不过没关系只需要把画点和画字的先后顺序修改下就行了,这里不贴图了;

结合RazorPage模板,展示验证码图片

上面一节是生成了验证码图片,当然实际场景中我们是不需要生成验证码物理图片的,只需要返回一个流或base64等方式输出到web界面上就行了,我们可以来看看 Image<TPixel> 保存时候的扩展方法:

好吧有点多,我们只需要明白她能转base64,stream,保存为图片等就行了;这里我们将用到 SaveAsPng(Stream) 方法,然后获取他的byte[],如下代码:

/// <summary>/// 画点+画字=验证码byte[]           /// </summary>/// <param name="content">验证码</param>/// <param name="outImgPath">输出图片路径</param>/// <param name="fontFilePath">字体文件</param>/// <param name="x">图片宽度</param>/// <param name="y">图片高度</param>public byte[] GetValidCodeByte(                    string content = "我是神牛",                    string fontFilePath = @"D:\F\学习\vs2017\netcore\Study.AspNetCore\WebApp02-1\wwwroot\bak\STKAITI.TTF",                    int xx = 150, int yy = 25){            

var bb = default(byte[]);            try{           var dianWith = 1; //点宽度var xx_space = 10;  //点与点之间x坐标间隔var yy_space = 5;    //y坐标间隔var wenZiLen = content.Length;  //文字长度var maxX = xx / wenZiLen; //每个文字最大x宽度var prevWenZiX = 0; //前面一个文字的x坐标var size = 16;//字体大小                //字体var install_Family = new FontCollection().Install(fontFilePath                  //@"C:\Windows\Fonts\STKAITI.TTF"   //windows系统下字体文件                  );                             var font = new Font(install_Family, size);  //字体                //点坐标var listPath = new List<IPath>();                for (int i = 0; i < xx / xx_space; i++){                    for (int j = 0; j < yy / yy_space; j++){                        

var position = new Vector2(i * xx_space, j * yy_space);                        var linerLine = new LinearLineSegment(position, position);                        var shapesPath = new SixLabors.Shapes.Path(linerLine);listPath.Add(shapesPath);}}                 //画图using (Image<Rgba32> image = new Image<Rgba32>(xx, yy))   //画布大小                {image.Mutate(x =>{                    var imgProc = x;                        //逐个画字for (int i = 0; i < wenZiLen; i++){                            //当前的要输出的字var nowWenZi = content.Substring(i, 1);                            //文字坐标var wenXY = new Vector2();                            var maxXX = prevWenZiX + (maxX - size);wenXY.X = new Random().Next(prevWenZiX, maxXX);wenXY.Y = new Random().Next(0, yy - size);prevWenZiX = Convert.ToInt32(Math.Floor(wenXY.X)) + size;                            //画字                            imgProc.DrawText(nowWenZi,   //文字内容                                   font,i % 2 > 0 ? Rgba32.HotPink : Rgba32.Red,wenXY,TextGraphicsOptions.Default);}                         //画点 imgProc.BackgroundColor(Rgba32.WhiteSmoke).   //画布背景                                     Draw(Pens.Dot(Rgba32.HotPink, dianWith),   //大小new SixLabors.Shapes.PathCollection(listPath)  //坐标集合                                 );});                    using (MemoryStream stream = new MemoryStream()){image.SaveAsPng(stream);bb = stream.GetBuffer();}}}                    catch (Exception ex){}             return bb;}

该方法返回了一个byte[]数组,然后通过HttpGet方式请求Razor接口,前端就能够获取到这个验证码图片byte[]了;

/// <summary>/// Get获取验证码图片byte[]          /// </summary>/// <returns></returns>public FileResult OnGetValidCode(){            var codebb = GetValidCodeByte(DateTime.Now.ToString("mmssfff"));            return File(codebb, "image/png");}

我们通过get请求获取验证码: http://localhost:1120/login?handler=ValidCode ,然后得到如图效果:

本篇内容到此就结束了,如果对您有好的帮助,不妨点个“赞”;一起努力推动NetCore发展吧,谢谢。

原文地址: http://www.cnblogs.com/wangrudong003/p/7656842.html


.NET社区新闻,深度好文,微信中搜索dotNET跨平台或扫描二维码关注

ImageSharp一个专注于NetCore平台图像处理的开源项目相关推荐

  1. 我发起了一个 用 物理服务器 和 .Net 平台 构建云平台 的 .Net 开源项目

    大家好 , 我发起了一个 用 物理服务器 和 .Net 平台 构建云平台 的 .Net 开源项目 . 对 , 用 物理服务器 和 .Net 平台 构建 云平台 . 通过 .Net 构建 分布式 计算集 ...

  2. ffmpeg sdk java_推荐一个强大的音视频处理的开源项目!

    原标题:推荐一个强大的音视频处理的开源项目! 1.前景提要 在我们的开发中,经常会用到音视频相关内容,一般我们都会选择FFmpeg,但是其交叉编译对于我们来说是一件很麻烦的事情.所以这里方便日后使用就 ...

  3. 阿里云机器学习平台PAI+AI开源项目测评来啦

    一.背景介绍 阿里AI(阿里灵杰)依托阿里领先的云基础设施.大数据和AI工程能力.场景算法技术和多年行业实践,一站式地为企业和开发者提供云原生的AI能力体系.帮助提升AI应用开发效率,促进AI在产业中 ...

  4. 一个基于Python数据大屏可视化开源项目

    ‍‍ 今天给大家介绍一个开源数据大屏可视化工具. 项目简介 这是一个基于Python开发的,结构简单的项目.可通过配置Json的数据,实现数据报表大屏显示. 优点:代码清晰.结构简单.配置Json数据 ...

  5. 专访.NET平台上类RoR开源项目Castle[转载]

    Castle Project是一个运行在.NET之上的开源项目,提供了类似流行的Ruby on Rails的MVC (Model-View-Controller)框架.Castle Project自从 ...

  6. android 登录界面开源代码_【程序源代码】一个安卓查询类app制作的开源项目

    " 关键字:工作流 框架 springboot" 正文:一个学习安卓查询类app制作的开源项目.可以用来联系查询类app的编写. 01 - android studio最近势头好猛 ...

  7. 【程序源代码】一个安卓查询类app制作的​开源项目

    " 关键字:工作流 框架 springboot" 正文:一个学习安卓查询类app制作的开源项目.可以用来联系查询类app的编写. 01 - android studio最近势头好猛 ...

  8. 老板心血来潮要自己搞低代码平台?这个开源项目试一试!

    大家好,我是TJ 一个励志推荐10000款开源项目与工具的程序员 平日里大家编码的时候肯定想着如何能提高自己的工作效率,那么一种方法肯定是提高自身的编码水平,但是同时工欲善其事必先利其器,如果有一款好 ...

  9. 推荐一个java的商业级saas电商开源项目

    该项目使用Java开发,SpringBoot框架.MyBatis-plus持久层框架.Redis作为缓存.MySql作为数据该库. 前端vuejs作为开发语言,使用uniapp编码,同时支持微信小程序 ...

最新文章

  1. 转:SAP 零售业POS心得分享
  2. 产品经理技能树之 数据体系
  3. php和mysql入门_PHP和MySQL入门(10)
  4. 【Java 虚拟机原理】JDK 体系结构 | Java 源码运行原理 | Java 虚拟机内存
  5. 用C#进行ArcGIS 10 Engine 开发 - 安装配置和入门程序说明
  6. RTT设备与驱动之PIN设备
  7. 15 张图,了解一下 TCP/IP 必知也必会的 10个要点
  8. 世界上首个被数学证明安全的OS微内核seL4成立基金会
  9. [framework] multi learner
  10. 在线世界地图生成器 pixelmap可调色
  11. ext2文件系统初步
  12. 4G+5G多卡聚合(弱网通信)路由器视频传输最佳选择
  13. java speex转码_JAVA版-微信语音.speex转.wav
  14. 新手卖家如何获得更多流量?这些关键词优化技巧你GET了吗
  15. #三、回测试验给我们的启示
  16. 微服务拆分时机与原则
  17. Js中var,let,const的区别
  18. Qt中Label标签的使用
  19. 使用Delphi进行相机访问
  20. Ubuntu12更新重启之后,只在左上角出现一闪一闪的小横杠

热门文章

  1. GPhone、OPhone、UPhone、APhone、IPhone:满城尽带XPhone
  2. std::thread 不 join
  3. SQL Server2016导出数据表数据
  4. 链表笔试题汇编(一)
  5. Linux学习笔记 1 环境变量 2 vi命令
  6. Cowboy 源码分析(十八)
  7. 我将 20 年前开发的操作系统迁移到 .NET 6,竟然成功了!
  8. .NET 6 攻略大全(三)
  9. 对SQL server、Oracle、MySQL和PostgreSQL进行OLTP性能测试(Benchmark)
  10. 试用GitHub Copilot一周后,我给你的建议是:不要使用它