写点什么

DotNetCore 开发工具箱之图片处理小能手——SixLabors.ImageSharp

作者:为自己带盐
  • 2021 年 12 月 17 日
  • 本文字数:1749 字

    阅读完需:约 6 分钟

DotNetCore开发工具箱之图片处理小能手——SixLabors.ImageSharp

话说当年

在 DotnetCore 流行之前的 dotnet framework 时代,用过一个处理图片的工具——ImageProcessor,非常的好用,尤其是 web 平台,引用 ImageProcessor.Web 之后,几乎不需要任何操作,这个组件会以无侵入的方式集成到项目里,可以通过 url 参数来对图片进行快速的缩放,裁剪等操作,非常方便,可惜目前还不支持 dotnet core 平台。

在 DotNet 跨平台多年之后,仍然坚守在 dotnet framework 时代,显然是不明智的,所以原来积累的一些好用的工具,如果不能随着时代而改变,就要做出合适的选择了。

回到今天

在 DotNetCore 平台里,也有这么一款专门为了图片处理而生的开源组件,就是SixLabors.ImageSharp。ImageProcessor 支持的接口和操作,SixLabors 几乎都支持,而且依赖包更少,支持的平台更广,它还是 .Net 基金会支持的一个项目。


实例展示

1、让站点内的图片,全部可以通过 url 快速修改——ImageSharp.Web 中间件

先配置好服务

//配置参考:https://github.com/SixLabors/ImageSharp.Webservices.AddImageSharp(options =>{  options.Configuration = SixLabors.ImageSharp.Configuration.Default;  options.MemoryStreamManager = new RecyclableMemoryStreamManager();  options.BrowserMaxAge = TimeSpan.FromDays(7);  options.CacheMaxAge = TimeSpan.FromDays(365);  options.CachedNameLength = 8;  options.OnParseCommandsAsync = _ => Task.CompletedTask;  options.OnBeforeSaveAsync = _ => Task.CompletedTask;  options.OnProcessedAsync = _ => Task.CompletedTask;  options.OnPrepareResponseAsync = _ => Task.CompletedTask;});
复制代码

再注册服务

//注入imageSharpapp.UseImageSharp();
复制代码

如此,网站的链接遍具备了通过链接参数,调整图片的能力。

比如正常访问站点内的一张图

如果想缩放一下就可以这样

2、集成更多的能力,让图片和文字不分彼此

我们在实际的业务需求里,会合成一些电子证书,证书上,会有文字,二维码,公章等内容,所以,底层的操作就是图片合成,那么通过 ImageSharp.Drawing 的能力,就可以通过非常简单的代码来完成这些操作。

比如,我想合成图片,可以这样

/// <summary>/// 合并图片/// </summary>/// <param name="templateImageData"></param>/// <param name="mergeImageData">合并图片字节流</param>/// <param name="x">X坐标</param>/// <param name="y">y坐标</param>/// <returns></returns>public Image MergeImage(byte[] templateImageData, byte[] mergeImageData, int x, int y){  var templateImage = Image.Load(templateImageData);  // 加载需要合并的图片  var mergeImage = Image.Load(mergeImageData);
templateImage.Mutate(o => { o.DrawImage(mergeImage, new Point(x, y), 1); });
return templateImage;}
复制代码

如果获取字节流比较麻烦,也可以直接传入路径或者文件流,Image.Load 方法会自动识别传入的类型来加载对象。

再比如,我想在图片上写字,可以这样

/// <summary>/// 图片上写字/// https://docs.sixlabors.com/articles/imagesharp.drawing/gettingstarted.html#expanded-example/// </summary>/// <param name="ImageData"></param>/// <param name="x"></param>/// <param name="y"></param>/// <param name="txt"></param>/// <param name="fontPath"></param>/// <returns></returns>public Image DrawingTextOnImage(byte[] ImageData, int x, int y,string txt,string fontPath){  var image = Image.Load(ImageData);  FontCollection collection = new FontCollection();  string fontFile = @$"{fontPath}\fonts\siyuansongti.ttf";  FontFamily family = collection.Install(fontFile);  Font font = family.CreateFont(12, FontStyle.Regular);  PointF point = new PointF(x, y);  image.Mutate(x => x.DrawText(txt, font, Color.Black, point));              return image;}
复制代码

有了这两个基本操作,再往后,我们就可以根据实际的业务,来输出目标结果了,

比如我要在某一个模板上传入多组文字,多组图片,最终合成一张证书,这里的代码我就不贴了,基本方法就是上面的方法,只是多了一些业务逻辑而已。

最终就可以生成一批类似这样的证书文件,方便快捷。


发布于: 2 小时前阅读数: 4
用户头像

学着码代码,学着码人生。 2019.04.11 加入

狂奔的小码农

评论

发布
暂无评论
DotNetCore开发工具箱之图片处理小能手——SixLabors.ImageSharp