.NET Core 使用 ImageSharp 生成图片

前言

ImageSharp是对.NET Core平台扩展的一个图像处理方案,以往网上的案例多以生成文字及画出简单图形、验证码等方式进行探讨和实践。

分享一下所在公司项目的实际应用案例,导出微信二维码图片,圆形头像等等。

一、源码获取

Git项目地址:https://github.com/SixLabors/ImageSharp

安装这两个包即可:

Install-Package SixLabors.ImageSharp -Version 1.0.0-beta0001

Install-Package SixLabors.ImageSharp.Drawing -Version 1.0.0-beta0001

二、应用

1、在图片中画出文字

首先要注意字体问题,Windows自带的字体一般存储于 C:\Windows\Fonts 文件夹内,如果是部署在Linux系统的应用程序,则存储于 usr/share/fonts 文件夹内。

以黑体为例,我们找到对应的字体文件 SIMHEI.TTF ,将其放入项目的根目录内方便调用。

var path = "Image/Mud.png"             //图片路径
FontCollection fonts = new FontCollection();
FontFamily fontfamily = fonts.Install("Source/SIMHEI.TTF"); //字体的路径     var font  = new Font(fontfamily,50);
using (Image<Rgba32> image = Image.Load(path))
{image.Mutate(x => x.DrawText ("陆家嘴旗舰店",           //文字内容font,Rgba32.Black,           //文字颜色new PointF(100,100))    //坐标位置(浮点));image.Save(path);}

关于Image.Load()获取图片方法的使用,可以直接读取Stream类型的流,也可以根据图片的本地路径获取。

//线上地址的图片,通过获取流的方式读取   
WebRequest imgRequest = WebRequest.Create(url);
var res = (HttpWebResponse)imgRequest.GetResponse();
var image  = Image.Load(res.GetResponseStream());

获取文字的像素宽度,可以使用:

var str = "我是什么长度"; 
var size = TextMeasurer.Measure(str, new RendererOptions(new Font(fontfamily,50)));  
var width = size.Width;

2、在图片中画出圆形的头像

在ImageSharp的源码中,发现有画圆形的工具类可以使用,在这里直接copy出来。

using SixLabors.ImageSharp;
using SixLabors.ImageSharp.PixelFormats;
using SixLabors.ImageSharp.Processing;
using SixLabors.Primitives;
using SixLabors.Shapes;
using System;
using System.Collections.Generic;
using System.Text;namespace CodePicDownload
{public static class CupCircularHelper{public static IImageProcessingContext<Rgba32> ConvertToAvatar(this IImageProcessingContext<Rgba32> processingContext, Size size, float cornerRadius){return processingContext.Resize(new ResizeOptions{Size = size,Mode = ResizeMode.Crop}).Apply(i => ApplyRoundedCorners(i, cornerRadius));}// This method can be seen as an inline implementation of an `IImageProcessor`:// (The combination of `IImageOperations.Apply()` + this could be replaced with an `IImageProcessor`)private static void ApplyRoundedCorners(Image<Rgba32> img, float cornerRadius){IPathCollection corners = BuildCorners(img.Width, img.Height, cornerRadius);var graphicOptions = new GraphicsOptions(true){AlphaCompositionMode = PixelAlphaCompositionMode.DestOut // enforces that any part of this shape that has color is punched out of the background};// mutating in here as we already have a cloned original// use any color (not Transparent), so the corners will be clippedimg.Mutate(x => x.Fill(graphicOptions, Rgba32.LimeGreen, corners));}private static IPathCollection BuildCorners(int imageWidth, int imageHeight, float cornerRadius){// first create a squarevar rect = new RectangularPolygon(-0.5f, -0.5f, cornerRadius, cornerRadius);// then cut out of the square a circle so we are left with a cornerIPath cornerTopLeft = rect.Clip(new EllipsePolygon(cornerRadius - 0.5f, cornerRadius - 0.5f, cornerRadius));// corner is now a corner shape positions top left//lets make 3 more positioned correctly, we can do that by translating the orgional artound the center of the imagefloat rightPos = imageWidth - cornerTopLeft.Bounds.Width + 1;float bottomPos = imageHeight - cornerTopLeft.Bounds.Height + 1;// move it across the width of the image - the width of the shapeIPath cornerTopRight = cornerTopLeft.RotateDegree(90).Translate(rightPos, 0);IPath cornerBottomLeft = cornerTopLeft.RotateDegree(-90).Translate(0, bottomPos);IPath cornerBottomRight = cornerTopLeft.RotateDegree(180).Translate(rightPos, bottomPos);return new PathCollection(cornerTopLeft, cornerBottomLeft, cornerTopRight, cornerBottomRight);}}
}

有了画圆形的方法,我们只需要调用ConvertToAvatar() 方法把方形的图片转为圆形,画在图片上即可。

using (Image<Rgba32> image = Image.Load("Image/Mud.png"))
{var logoWidth = 300;var logo = Image.Load("Image/Logo.png")5     logo.Mutate(x => x.ConvertToAvatar(new Size(logoWidth, logoWidth), logoWidth / 2));  image.Mutate(x => x.DrawImage(logo, new Point(100, 100), 1));Image.Save("..");
}

3、处理二维码的BitMatrix类型

以微信获取的二维码类型为例,因为我的项目中二维码是从微信公众号平台API获取,在这次获取图片中,将BitMatrix类型转换为流的格式从而可以通过Image.Load()方法获取图片信息成为了关键。

在这里我还是引用到了System.Drawing,可以单独提取公用方法。

public void WriteToStream(BitMatrix QrMatrix, ImageFormat imageFormat, Stream stream)
{if (imageFormat != ImageFormat.Exif && imageFormat != ImageFormat.Icon && imageFormat != ImageFormat.MemoryBmp){DrawingSize size = m_iSize.GetSize(QrMatrix?.Width ?? 21);using (Bitmap bitmap = new Bitmap(size.CodeWidth, size.CodeWidth)){using (Graphics graphics = Graphics.FromImage(bitmap)){Draw(graphics, QrMatrix);bitmap.Save(stream, imageFormat);}}}
}

这样数据就存入了stream中,但直接用ImageSharp去Load处理过的流可能会有些问题,为了保险,我将数据流中的byte取出,实例化了一个新的MemoryStream类型。

这样,就可以获取到二维码的图片了。

//Matrix为BitMatrix类型数据,ImageFormat我选择了png类型
MemoryStream ms = new MemoryStream();   
WriteToStream(Matrix,System.Drawing.Imaging.ImageFormat.Png, ms);
byte[] data = new byte[ms.Length];
ms.Seek(0, SeekOrigin.Begin);
ms.Read(data, 0, Convert.ToInt32(ms.Length));
var image =  Image.Load(new MemoryStream(data));

最后附上保存后图片的效果:

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/52265.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

高清Apriltag图片生成和制作

近期需要用到Apriltag图像&#xff0c;作者源码给的图像像素太差&#xff0c;无法满足需要。 国内网站相关资料太少&#xff0c;有的作者还要收费&#xff0c;不理解。本来就是开源的东西。本文详细说明如何生成&#xff0c;并免费附上tag36h11 全系列图片下载链接。 1。 生成…

微信小程序生成海报图片导出相册

前言 小程序内通过静态模板和样式绘制 canvas &#xff0c;导出图片&#xff0c;可用于生成分享图等场景 一、效果预览 二、使用步骤 1.安装引入wxml-to-canvas Step1.运行小程序npm安装命令 npm install --save wxml-to-canvasStep2.JSON 组件声明 {"usingComponents…

chatgpt赋能python:Python中打开图片的方法

Python中打开图片的方法 Python是一种高级编程语言&#xff0c;非常流行和使用&#xff0c;因为它具有简单易用、可读性强、适合各种领域等优点。其中&#xff0c;打开图片也是Python中一个非常常见的操作。 在Python中&#xff0c;可以通过几行代码轻松实现打开图片的功能。…

三分钟4行命令构建chatgpt webapp,支持高并发以及上下文对话功能(2)

个人主页:https://yang1he.gitee.io 干货会越来越多的&#xff0c;欢迎来玩 三分钟4行命令构建chatgpt webapp,支持高并发以及上下文对话功能&#xff08;2&#xff09; version2 version1介绍 上下文对话清除历史信息内网公开 version2新增 重复信息自动去重高并发&#xff0c…

客户端突如其来的“白屏”等待该如何解决?

简介&#xff1a;一起由离线包重构引起的“白屏”等待现象的排查和解决案例 ——本文选自《阿里云SRE技术期刊》2021年02月刊 移动端的混合架构模式给 App 开发带来了崭新的空间&#xff0c;通过 H5 构建的业务模块可以实现高效快速的版本迭代&#xff0c;满足多样化的业务需求…

Postman打开一直加载白屏

问题&#xff1a;以前用的好好的&#xff0c;突然有天白屏打不来&#xff0c;一直加载中无响应 1、上网搜教程&#xff0c;环境变量也设置了POSTMAN_DISABLE_GPU、true 2、%appdata%目录下的postman文件也删除了&#xff08;postman未登录的慎删&#xff0c;可以搜教程应该可以…

微信小游戏可视化开发工具

我们来自微信小游戏的一个小团队&#xff0c;我们希望每个人都可以创建自己的小游戏&#xff0c;分享自己的创意&#xff0c;所以我们实现了一个门槛极低的游戏开发工具&#xff0c;在设计的时候我们尽量注意概念简单同时又可以实现各种类型的游戏&#xff0c;当前还是内测阶段…

基于tkinter制作的一个策略小游戏

目录 前言 登录界面 主界面 宣政殿 地图 吏部 兵部 户部 刑部 工部 礼部 御书房 后宫 宗人府 御马监 锦衣卫 司礼监 京城 后记 前言 前年本科毕业时&#xff0c;利用暑假的时间学习了一点tkinter&#xff0c;当时比较痴迷《君成录》、《皇帝成长计划》等策略养成…

AI绘画初体验(6pen平台)

最近AI绘画似乎很火热&#xff0c;今天体验了AI绘画。 使用平台&#xff1a;6pen 似乎对幻想出来的图片效果不是很好&#xff0c;而对语言简练、写实的图片效果很棒&#xff01; 展示&#xff1a; 1 宇航员在火星上&#xff0c;坐着椅子下象棋&#xff0c;背景是远处的地球 2 …

【回答问题】ChatGPT上线了!给我推荐20个比较流行的AI作画模型!

目录 给我推荐20个比较流行的AI作画模型给我推荐20个比较流行的AI作画模型代码给我推荐20个比较流行的AI作画模型 好的,下面是20个比较流行的AI作画模型: DALL-E GAN Deep Dream CycleGAN StyleGAN pix2pix SketchRNN BigGAN ProGAN ESRGAN SPADE BigVAE StackGAN VQ-VAE 3…

AI绘画——ChilloutMix模型(现实真人,实现写实逼真的图像)

目录 重要提示&#xff1a;首先&#xff0c;我从不建议再生“真实”人物的图像&#xff0c; 但是&#xff0c;照片“逼真”图像。 本人郑重声明&#xff1a;本模型原则上禁止用于训练基于明星、公众人物肖像的风格模型训练&#xff0c;因为这会带来争议&#xff0c;对AI社区…

ai绘画软件“数画”上线元宇宙真人虚拟头像,技术远超国外

近日&#xff0c;国内AI绘画应用软件“数画”官方发布一条公告&#xff0c;引起整个AI绘画业界的轰动。公告显示“数画”上线真人元宇宙AI虚拟头像制作功能,并于2022年11月18日开始为画友正式投入服役。此种技术仅需几秒就可以将自已的照片或用手机自拍AI绘画成元宇宙中你的样子…

计算机英语ppt演讲稿,英语ppt演讲稿

英语ppt演讲稿 英语ppt演讲稿(1) Hello everybody, I am glad to have this opportunity to stand here and we communicate, we all know both sides of the same coin have, and we also have both positive and negative life: bright, happy, happy, hope, etc. This repre…

详解Docker!

&#xff08;永久免费&#xff0c;扫码加入&#xff09; 来源丨网络 本次分享Docker学习教程&#xff0c;有点长&#xff5e; 目录 1 容器简介1.1 什么是 Linux 容器1.2 容器不就是虚拟化吗1.3 容器发展简史2 什么是 Docker&#xff1f;2.1 Docker 如何工作&#xff1f;2.2 Doc…

chatgpt赋能python:Python怎么建服务器?

Python怎么建服务器&#xff1f; 作为一名具有10年Python编程经验的工程师&#xff0c;我深入研究了Python的一些高级特性&#xff0c;其中包括Python如何建立服务器的方法。Python是一个高级的编程语言&#xff0c;可以轻松创建服务器应用程序&#xff0c;并为您的网站提供高…

通过Java代码的方式将jar包以及快照上传至nexus上,通过与chatgpt对话的方式完成

通过Java代码的方式将jar包以及快照上传至nexus上 release库snapshots库 与chatgpt的对话 release库 release库的直接在nexus页面上找接口就可以&#xff0c;通过restTemplate调用即可成功 import org.springframework.core.io.FileSystemResource; import org.springframewo…

chrome插件推荐

chrome插件推荐 chrome的一些插件, 真的能很大程度上提升我们的工作效率。而且chrome的插件极其丰富, 基本你想要的功能,都能找到对应的插件&#xff0c;接下来给大家推荐几个我自己在用的。 插件 1、Momentum 新标签页 简介: 超漂亮的新标签页面。每日更新精彩背景壁纸图片&…

2022 开放原子全球开源峰会 OpenAnolis 分论坛携干货来袭

开源运动伊始&#xff0c;Linux 操作系统作为 GNU 运动最有力的补充&#xff0c;成为所有开源人心中经典的开源项目代表。 Linux 社区是当前全球最大也是最知名的开源社区&#xff0c;在 Linux 操作系统的温床之上&#xff0c;衍生出了许多深受开发者喜爱的开源操作系统&#…

免费开放注册| 首次!微软全球八大研究院齐聚,带你尽享全球学术盛宴

由微软全球八大研究院携手倾力打造的首届微软研究峰会 Microsoft Research Summit 2021将于10月19日至21日在线上举办。来自全球科技界、学术界、工业界的同仁们将相聚云端&#xff0c;激荡智慧&#xff0c;共同探讨拓展科技边界的前沿研究&#xff0c;以多元视角呈现科技创新中…

2022 SDCon 全球软件研发技术大会,19大技术主题破企业之寒

随着信息革命的飞速发展&#xff0c;软件已深入人类生活的方方面面&#xff0c;深刻而彻底地改造了人类世界。Boolan秉承“全球专家、卓越智慧”的宗旨&#xff0c;我们特邀近40位全球软件领域的技术领袖以及一线实战专家&#xff0c;融合主题演讲、互动研讨、案例分享、高端培…