博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
.NET Core:使用ImageSharp跨平台处理图像
阅读量:5021 次
发布时间:2019-06-12

本文共 2234 字,大约阅读时间需要 7 分钟。

一.简述

是一个新的跨平台2D图形API,旨在处理图像而不使用System.Drawing。

二.安装

目前ImageSharp还是处于alpha版本,所以我们需要在nuget中添加它的地址:

 

三.画验证码()

在使用ImageSharp之前,已经有基于Zkweb.system.drawing的.netcore跨平台验证码方案,为了很好的做对比,这里参考

1.生成画布或者在其他图片上画

using (image = new Image(400, 400)) using (FileStream streamTemple = System.IO.File.OpenRead(someImg)) using (var pixels = image.Lock()) { }

2.绘制遍布背景的噪点

对比Zkweb的DrawRectangle,我暂时只能用曲线救国的方法,让整个画布遍布可以见的灰色正方形小点。除了这个噪点干扰外,我同时也画了两条贝塞尔样条。

for (int i = 0; i < 50; i++){   GraphicsOptions noneDefault = new GraphicsOptions(); ImageSharp.Rectangle rectangle = new ImageSharp.Rectangle(random.Next(image.Width), random.Next(image.Height), 1, 1);//正方形小灰点 image.Draw(Color.Gray, 1f, rectangle, noneDefault); }

3.绘制验证码

在Zkweb中绘制二维码使用的方法:

g.DrawString(code.Substring(i, 1), font, brush, 3 + (i * 12), ii);//绘制一个验证字符

对比ImageSharp:

image.DrawText(code.Substring(i, 1), font, brush, new System.Numerics.Vector2(3 + (i * 12), ii));//绘制一个验证字符

可以说是异曲同工,看上去就是函数的名称变化而已,参数还是一样的。同样的,Zkweb为了跨平台需要将用到的字体复制到对应的环境中。ImageSharp也是如此,好处是可以显式地指定字体的路径。

var fontCollection = new FontCollection();//目前只支持ttf格式的字体  var font1 = fontCollection.Install(ttfPath);//字体的路径,也就是可以使用配置文件来指定字体 var font2 = fontCollection.Install(ttfStream);//读取字体文件

3.效果

为了验证是否跨平台,特意在docker的环境中运行了一遍(没有Mac,无法测试是否能在mac上用),效果如下:

效果

四.图形合成

ImageSharp支持同时处理多张图片(如果图片太大的话,可能处理不了)。利用这个功能,我可以把我的二维码放到一个模板中,生成一个类似海报的二维码图片,如下图:

海报模板

1.加载多张图片

using (FileStream streamTemple = System.IO.File.OpenRead(templeName))using (FileStream streamQrcode = System.IO.File.OpenRead(myrcodName)) using (FileStream output = System.IO.File.OpenWrite(qrcodeName)) using ... { var imageTemple = new ImageSharp.Image(streamTemple); var imageQrcode = new ImageSharp.Image(streamQrcode); }

2.在模板上画出二维码

//在指定的位置画出二维码 imageTemple.DrawImage(imageQrcode, 100, new ImageSharp.Size(imageQrcode.Width, imageQrcode.Height), new ImageSharp.Point(imageTemple.Width / 3, imageTemple.Height / 2));//时间 imageTemple.DrawText($"生成日期{DateTime.Now.ToString("yyyy.MM.dd")}", new SixLabors.Fonts.Font(font, imageTemple.Width / 40, FontStyle.Regular), new ImageSharp.Color(0, 0, 0), new System.Numerics.Vector2(imageTemple.Width* 1/3, imageTemple.Height*9/10));

其中,Point代表的是位移,x是从左到右,y是从下到上。

3.最终效果

最终效果

转载于:https://www.cnblogs.com/chenug/p/6655745.html

你可能感兴趣的文章
洛谷P2915 [USACO08NOV]奶牛混合起来Mixed Up Cows 状压动归
查看>>
RabbitMQ基础知识
查看>>
C语言 · x的x次幂结果为10
查看>>
typeerror $.ajax is not a function
查看>>
MongoDB数据库的备份和恢复
查看>>
Ajax 完整教程 (转)
查看>>
Android使用AIDL跨进程通信
查看>>
iOS CAShapeLayer、CADisplayLink 实现波浪动画效果
查看>>
C语言发展历史
查看>>
RAID磁盘分区的创建
查看>>
Zabbix安装步骤以及错误解决
查看>>
IntelliJ IDEA学习笔记连载一IntelliJ IDEA安装及破解
查看>>
富文本编辑
查看>>
如何优雅的设计APP页面?
查看>>
TreeMap底层源分析
查看>>
WKWebview 和 WebViewJavascriptBridge
查看>>
C++入门级 一
查看>>
PS--电影效果滤镜
查看>>
手机fiddler抓包时出现了tunnel to ......443,完美解决
查看>>
第一篇博客
查看>>