iis服务器助手广告广告
返回顶部
首页 > 资讯 > 后端开发 > ASP.NET >.NetCore使用ImageSharp进行图片的生成
  • 455
分享到

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

2024-04-02 19:04:59 455人浏览 薄情痞子
摘要

目录一、源码获取二、应用1.在图片中画出文字2.在图片中画出圆形的头像3.处理二维码的BitMatrix类型ImageSharp是对netcore平台扩展的一个图像处理方案,以往网上

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图片生成内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

--结束END--

本文标题: .NetCore使用ImageSharp进行图片的生成

本文链接: https://www.lsjlt.com/news/151746.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

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

下载Word文档
猜你喜欢
  • .NetCore使用ImageSharp进行图片的生成
    目录一、源码获取二、应用1.在图片中画出文字2.在图片中画出圆形的头像3.处理二维码的BitMatrix类型ImageSharp是对NetCore平台扩展的一个图像处理方案,以往网上...
    99+
    2024-04-02
  • .NetCore中使用EFCore生成反向工程
    一、简要步骤 1、第一步 安装以下程序包 安装Entity FrameWork Core SqlServer 3.1安装Entity FrameWork Core Tools 3.1...
    99+
    2024-04-02
  • Java使用Servlet生成验证码图片
    本文实例为大家分享了Java使用Servlet生成验证码图片的具体代码,供大家参考,具体内容如下 一、实现思路 1、使用BufferedImage用于在内存中存储生成的验证码图片 2...
    99+
    2024-04-02
  • vue3如何将html元素变成canvas(海报生成),进行图片保存/截图
    目录将html元素变成canvas(海报生成),进行图片保存/截图使用html2canvas将页面转化为图片将html元素变成canvas(海报生成),进行图片保存/截图 // 网页...
    99+
    2024-04-02
  • 使用canvas怎么将二维码和图片进行合成
    这期内容当中小编将会给大家带来有关使用canvas怎么将二维码和图片进行合成,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。实现思路是这样的使用jr-qrcode将url生成data:base64供img使...
    99+
    2023-06-09
  • 使用ImageMagick进行图片缩放、合成与裁剪(js+python)
    最近的项目里面需要对书籍的封面进行处理,就是加一条阴影线形成书脊的凹凸感,然后将书脊切出,分成两部分,以便客户端实现打开动画。由于需要在服务器端处理,使用就研究使用imagemagi...
    99+
    2022-11-15
    ImageMagick 图片缩放 合成 裁剪
  • 如何使用Python生成九宫格图片
    这篇文章将为大家详细讲解有关如何使用Python生成九宫格图片,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。一、前言大家在朋友圈应该看到过用一张图片以九宫格的方式显示,效果大致如下:要实现上面的效果非常简...
    99+
    2023-06-14
  • 使用python进行图片的文字识别
    使用python进行图片的文字识别 文章目录 使用python进行图片的文字识别安装 Tesseract OCR安装过程配置系统的环境变量 安装python的第三方库Pytesserac...
    99+
    2023-09-08
    python windows pytesseract Tesseract ORC
  • Java图片转字符图片的生成方法
    前面介绍了一篇java实现图片灰度化处理的小demo,接下来再介绍一个有意思的东西,将一个图片转换成字符图片 借助前面图片灰度化处理的知识点,若我们希望将一张图片转成字符图片,同样可...
    99+
    2024-04-02
  • laravel 使用 Intervention/image 进行图片处理
    1.安装 使用Composer在命令行安装最新版本的Intervention Image: composer require intervention/image 2.集成到Laravel 安装好Intervention Image后,打开...
    99+
    2023-09-06
    laravel php
  • 使用php无法生成图片怎么解决
    使用php无法生成图片怎么解决?相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。php无法生成图片怎么办?PHP验证码不能生成图片,原因解决生成图片时,header('Co...
    99+
    2023-06-15
  • 如何使用Node进行图片压缩
    这篇文章主要介绍“如何使用Node进行图片压缩”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“如何使用Node进行图片压缩”文章能帮助大家解决问题。我们先把图片上传到后端,看看后端接收了什么样的参数。...
    99+
    2023-07-05
  • 使用文心大模型ERNIE-ViLG生成图片
    前言 大家好,我是阿光。 本专栏整理了《PyTorch深度学习项目实战100例》,内包含了各种不同的深度学习项目,包含项目原理以及源码,每一个项目实例都附带有完整的代码+数据集。 正在更新中~ ✨ 🚨...
    99+
    2023-09-15
    深度学习 人工智能 python pytorch
  • 使用PHP进行PDF生成的最佳实践
    PDF已成为一种受欢迎的文件格式,广泛用于各种场景,包括电子书、报表和证明文件。在PHP中,可以使用多种库和工具来生成PDF文档,但是如何选择最佳实践?以下是使用PHP进行PDF生成的最佳实践:1.选择适当的库PHP中有多个PDF库可供选择...
    99+
    2023-05-23
    实践 PHP PDF
  • .NETCore使用EF生成数据库出错的解决方法
    在.NET Core 项目钟(类库),使用Entity Framework,建立模型生成数据库时,失败 Could not load assembly 'xxx'. Ensure i...
    99+
    2024-04-02
  • 如何用Servlets动态生成图片
    这篇文章给大家介绍如何用Servlets动态生成图片,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。Image I/O 包及对 JDK 的要求   如果你的 servlet 要动态生成图象,首先你需要 image I/O...
    99+
    2023-06-03
  • python使用Faker进行随机数据生成
    目录Faker的介绍安装Faker操作详情语言编码随机日期进行生成随机字母进行生成随机数字进行生成随机个人信息进行生成随机公司信息进行生成随机文字/句子进行生成随机网络信息生成随机城...
    99+
    2024-04-02
  • 使用java如何生成一个验证码图片
    本文章向大家介绍使用java如何生成一个验证码图片的基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。Java的特点有哪些Java的特点有哪些1.Java语言作为静态面向对象编程语言的代表,实现了面向对象理论,允许程...
    99+
    2023-06-06
  • 如何使用Golang来进行图片转码
    Golang是一门现代编程语言,其强大的并发性、内存安全性和高效性使它成为了许多开发者的首要选择。对于开发者来说,使用Golang来进行图片转码操作也是一种不错的选择。那么接下来,我们将会了解如何使用Golang来进行图片转码。图片转码的概...
    99+
    2023-05-14
  • PyTorch 使用torchvision进行图片数据增广
    目录使用torchvision来进行图片的数据增广1. 读取图片2. 图片增广2.1 图片水平翻转2.2 图片上下翻转2.3 图片旋转2.4 中心裁切2.5 随机裁切2.6 随机裁切...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作