我的编程空间,编程开发者的网络收藏夹
学习永远不晚

.NetCore使用ImageSharp进行图片的生成

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

.NetCore使用ImageSharp进行图片的生成

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

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

一、源码获取

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 clipped
            img.Mutate(x => x.Fill(graphicOptions, Rgba32.LimeGreen, corners));
        }
        private static IPathCollection BuildCorners(int imageWidth, int imageHeight, float cornerRadius)
        {
            // first create a square
            var rect = new RectangularPolygon(-0.5f, -0.5f, cornerRadius, cornerRadius);
            // then cut out of the square a circle so we are left with a corner
            IPath 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 image
            float 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 shape
            IPath 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));

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

本篇内容到此就结束了,非常感谢您的观看,有机会的话,希望能够一起讨论技术,一起成长!

到此这篇关于.NetCore如何使用ImageSharp进行图片的生成的文章就介绍到这了,更多相关.NetCore使用ImageSharp图片生成内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

.NetCore使用ImageSharp进行图片的生成

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

如何使用PHP进行图片验证码的生成和验证?(PHP生成和验证图片验证码的方法是什么?)

这篇文章介绍了如何使用PHP生成和验证图片验证码。它涉及使用imagecreate()创建画布、imagecolorallocate()设置背景色、substr(md5(uniqid()),0,5)生成随机字符串、imagettftext()绘制字符、imageline()添加干扰线和header("Content-type:image/jpeg")以及imagejpeg($image)输出图像的步骤。验证需要比较用户输入和存储在会话中的验证码。
如何使用PHP进行图片验证码的生成和验证?(PHP生成和验证图片验证码的方法是什么?)
2024-04-02

使用ImageMagick进行图片缩放、合成与裁剪(js+python)

由于需要在服务器端处理,使用就研究使用imagemagick来进行。同时准备封装了一个Node.js和Python的方法,主要还是讲一下然后使用imagemagick来对图片进行缩放、合成后进行裁剪吧
2022-11-15

使用canvas怎么将二维码和图片进行合成

这期内容当中小编将会给大家带来有关使用canvas怎么将二维码和图片进行合成,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。实现思路是这样的使用jr-qrcode将url生成data:base64供img使
2023-06-09

如何使用Python生成九宫格图片

这篇文章将为大家详细讲解有关如何使用Python生成九宫格图片,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。一、前言大家在朋友圈应该看到过用一张图片以九宫格的方式显示,效果大致如下:要实现上面的效果非常简
2023-06-14

如何使用Node进行图片压缩

这篇文章主要介绍“如何使用Node进行图片压缩”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“如何使用Node进行图片压缩”文章能帮助大家解决问题。我们先把图片上传到后端,看看后端接收了什么样的参数。
2023-07-05

使用php无法生成图片怎么解决

使用php无法生成图片怎么解决?相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。php无法生成图片怎么办?PHP验证码不能生成图片,原因解决生成图片时,header(Content
2023-06-15

JavaScript使用高阶生成器进行过滤以生成素数

本文介绍了如何使用JavaScript的高阶生成器和filter函数生成素数。使用高阶生成器可以按需生成值,提高内存效率。通过使用primeGenerator函数生成素数序列,并使用isPrime过滤函数过滤该序列,可以高效地实现素数生成。这种方法代码可读性高、复用性强、灵活且高效。
JavaScript使用高阶生成器进行过滤以生成素数
2024-04-02

使用Canvas怎么对图片进行处理

这篇文章给大家介绍使用Canvas怎么对图片进行处理,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。一、主要API整个流程中所用到的主要Canvas API有:绘制图像: drawImage()获取图像数据: getIm
2023-06-09

使用canvas怎么对图片进行压缩

本篇文章为大家展示了使用canvas怎么对图片进行压缩,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。前提的函数将file文件转化为base64/*** @param {二进制文件流} file *
2023-06-09

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录