话说当年
在 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.Web
services.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;
});
复制代码
再注册服务
//注入imageSharp
app.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;
}
复制代码
有了这两个基本操作,再往后,我们就可以根据实际的业务,来输出目标结果了,
比如我要在某一个模板上传入多组文字,多组图片,最终合成一张证书,这里的代码我就不贴了,基本方法就是上面的方法,只是多了一些业务逻辑而已。
最终就可以生成一批类似这样的证书文件,方便快捷。
评论