企业网站模板源码免费,南通网站开发公司,如何做网站推广下拉刘贺稳14,iis网站建设中今天大家分享的是一个专注于NetCore平台图像处理的开源项目#xff0c;老实说为这篇文章取名字想了5分钟#xff0c;可能是词穷亦或是想更好的表达出这款开源项目的作用#xff1b;这个项目在图像处理方面有很多功能#xff0c;如#xff1a;缩放#xff0c;裁剪#xf… 今天大家分享的是一个专注于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 (ImageRgba32 image new ImageRgba32(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 (ImageRgba32 image new ImageRgba32(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 (ImageRgba32 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 (ImageRgba32 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 ListIPath(); 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 (ImageRgba32 image new ImageRgba32(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); //保存} 这里直接利用IImageProcessingContextTPixel扩展方法Draw来绘制有规则的点如图所示 比较单调或许您们能做的更好看些下面来做验证码图片主要由画点画字验证码图片这里我封装了一个方法直接生成验证码图片 /// summary/// 画点画字验证码图片 /// /summary/// param namecontent验证码/param/// param nameoutImgPath输出图片路径/param/// param namefontFilePath字体文件/param/// param namex图片宽度/param/// param namey图片高度/parampublic 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 ListIPath(); 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 (ImageRgba32 image new ImageRgba32(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界面上就行了我们可以来看看 ImageTPixel 保存时候的扩展方法 好吧有点多我们只需要明白她能转base64stream保存为图片等就行了这里我们将用到 SaveAsPng(Stream) 方法然后获取他的byte[]如下代码 /// summary/// 画点画字验证码byte[] /// /summary/// param namecontent验证码/param/// param nameoutImgPath输出图片路径/param/// param namefontFilePath字体文件/param/// param namex图片宽度/param/// param namey图片高度/parampublic 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 ListIPath(); 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 (ImageRgba32 image new ImageRgba32(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/returnspublic FileResult OnGetValidCode(){ var codebb GetValidCodeByte(DateTime.Now.ToString(mmssfff)); return File(codebb, image/png);} 我们通过get请求获取验证码 http://localhost:1120/login?handlerValidCode 然后得到如图效果 本篇内容到此就结束了如果对您有好的帮助不妨点个“赞”一起努力推动NetCore发展吧谢谢。 原文地址 http://www.cnblogs.com/wangrudong003/p/7656842.html .NET社区新闻深度好文微信中搜索dotNET跨平台或扫描二维码关注