一.简述

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

二.安装

目前ImageSharp还是处于alpha版本,所以我们需要在nuget中添加它的地址:https://www.myget.org/F/imagesharp

 

三.画验证码(点我查看源码)

在使用ImageSharp之前,已经有基于Zkweb.system.drawing的.netcore跨平台验证码方案,为了很好的做对比,这里参考http://www.cnblogs.com/yuangang/p/6000460.html
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.最终效果

最终效果

最新文章

  1. macOS 我的装机
  2. NGUI裁剪模型和粒子
  3. document.write 摘抄
  4. Bilinear Filter
  5. title与h1标签的区别和联系
  6. cordova在app内部指定浏览器打开链接插件:cordova-plugin-inappbrowser
  7. Adobe Edge Animate –解决图形边缘精确检测问题-通过jquery加载svg图片
  8. Bison executable not found in PATH by mysql install
  9. 下载gtest
  10. c++中派生类对基类成员的三种访问规则(转)
  11. Python之美[从菜鸟到高手]--urlparse源码分析
  12. 利用dokan作虚拟磁盘开发
  13. 10分钟搞懂Tensorflow 逻辑回归实现手写识别
  14. EffectiveJava阅读笔记(一)
  15. linux 定时下载github最新代码
  16. RPC远程调用——Dubbo
  17. parse
  18. IntelliJ IDEA2018.3 最新破解方法
  19. 使用SharedPreference和对象流存储对象
  20. Dockerfile详解(二)

热门文章

  1. Jmeter接口测试使用beanshell断言json返回
  2. NFV、DPDK以及部分用户态协议研究
  3. 网口划VLAN
  4. php项目报错 Warning: session_start(): open(D:/software/wamp/wamp/tmp\sess_msrjot7f32ciqb1p2hr4ahejg4, O_RDWR) f
  5. Java面试题汇总
  6. 解决mysql漏洞 Oracle MySQL Server远程安全漏洞(CVE-2015-0411)
  7. 基于MATLAB的中值滤波均值滤波以及高斯滤波的实现
  8. 关于 dos 下 npm 命令的使用
  9. Mysql中字符集总结
  10. Matplotlib初体验