.NET Core:使用ImageSharp跨平台处理图像

简介: 一.简述ImageSharp是一个新的跨平台2D图形API,旨在处理图像而不使用System.Drawing。二.安装目前ImageSharp还是处于alpha版本,所以我们需要在nuget中添加它的地址:https://www.

一.简述

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.最终效果


最终效果


本文采用 知识共享署名-非商业性使用-相同方式共享 3.0 中国大陆许可协议
转载请注明来源: 张蘅水
我在开发者头条中还会每日分享不错的技术文章,搜索 356194 即可查看
目录
相关文章
|
29天前
|
消息中间件 前端开发 小程序
一个基于.NET Core构建的简单、跨平台、模块化的商城系统
今天大姚给大家分享一个基于.NET Core构建的简单、跨平台、模块化、完全开源免费(MIT License)的商城系统:Module Shop。
|
29天前
|
算法 C# 数据库
【干货】一份10万字免费的C#/.NET/.NET Core面试宝典
C#/.NET/.NET Core相关技术常见面试题汇总,不仅仅为了面试而学习,更多的是查漏补缺、扩充知识面和大家共同学习进步。该知识库主要由自己平时学习实践总结、网上优秀文章资料收集(这一部分会标注来源)和社区小伙伴提供三部分组成。该份基础面试宝典完全免费,发布两年来收获了广大.NET小伙伴的好评,我会持续更新和改进,欢迎关注我的公众号【追逐时光者】第一时间获取最新更新的面试题内容。
|
29天前
|
数据可视化 开发工具 C#
.NET开源、免费、跨平台的Git可视化管理工具
俗话说得好“工欲善其事,必先利其器”,合理的选择和使用可视化的管理工具可以降低技术入门和使用的门槛。今天大姚给大家分享一款.NET Avalonia开源、免费、跨平台、快速的Git可视化管理工具:SourceGit。
|
29天前
|
数据可视化 网络协议 C#
C#/.NET/.NET Core优秀项目和框架2024年3月简报
公众号每月定期推广和分享的C#/.NET/.NET Core优秀项目和框架(每周至少会推荐两个优秀的项目和框架当然节假日除外),公众号推文中有项目和框架的介绍、功能特点、使用方式以及部分功能截图等(打不开或者打开GitHub很慢的同学可以优先查看公众号推文,文末一定会附带项目和框架源码地址)。注意:排名不分先后,都是十分优秀的开源项目和框架,每周定期更新分享(欢迎关注公众号:追逐时光者,第一时间获取每周精选分享资讯🔔)。
|
12天前
|
开发框架 前端开发 JavaScript
JavaScript云LIS系统源码ASP.NET CORE 3.1 MVC + SQLserver + Redis医院实验室信息系统源码 医院云LIS系统源码
实验室信息系统(Laboratory Information System,缩写LIS)是一类用来处理实验室过程信息的软件,云LIS系统围绕临床,云LIS系统将与云HIS系统建立起高度的业务整合,以体现“以病人为中心”的设计理念,优化就诊流程,方便患者就医。
20 0
|
27天前
|
Linux API iOS开发
.net core 优势
.NET Core 的优势:跨平台兼容(Windows, macOS, Linux)及容器支持,高性能,支持并行版本控制,丰富的新增API,以及开源。
25 4
|
29天前
|
开发框架 人工智能 .NET
C#/.NET/.NET Core拾遗补漏合集(持续更新)
在这个快速发展的技术世界中,时常会有一些重要的知识点、信息或细节被忽略或遗漏。《C#/.NET/.NET Core拾遗补漏》专栏我们将探讨一些可能被忽略或遗漏的重要知识点、信息或细节,以帮助大家更全面地了解这些技术栈的特性和发展方向。
|
2月前
|
开发框架 中间件 .NET
C# .NET面试系列七:ASP.NET Core
## 第一部分:ASP.NET Core #### 1. 如何在 controller 中注入 service? 在.NET中,在ASP.NET Core应用程序中的Controller中注入服务通常使用<u>依赖注入(Dependency Injection)</u>来实现。以下是一些步骤,说明如何在Controller中注入服务: 1、创建服务 首先,确保你已经在应用程序中注册了服务。这通常在Startup.cs文件的ConfigureServices方法中完成。例如: ```c# services.AddScoped<IMyService, MyService>(); //
73 0
|
3月前
|
开发框架 前端开发 .NET
福利来袭,.NET Core开发5大案例,30w字PDF文档大放送!!!
为了便于大家查找,特将之前开发的.Net Core相关的五大案例整理成文,共计440页,32w字,免费提供给大家,文章底部有PDF下载链接。
39 1
福利来袭,.NET Core开发5大案例,30w字PDF文档大放送!!!
|
3月前
|
算法 BI API
C#/.NET/.NET Core优秀项目和框架2024年1月简报
C#/.NET/.NET Core优秀项目和框架2024年1月简报