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 ,将其放入项目的根目录内方便调用。

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

关于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出来。

 1 using SixLabors.ImageSharp;
 2 using SixLabors.ImageSharp.PixelFormats;
 3 using SixLabors.ImageSharp.Processing;
 4 using SixLabors.Primitives;
 5 using SixLabors.Shapes;
 6 using System;
 7 using System.Collections.Generic;
 8 using System.Text;
 9
10 namespace CodePicDownload
11 {
12     public static class CupCircularHelper
13     {
14
15         public static IImageProcessingContext<Rgba32> ConvertToAvatar(this IImageProcessingContext<Rgba32> processingContext, Size size, float cornerRadius)
16         {
17             return processingContext.Resize(new ResizeOptions
18             {
19                 Size = size,
20                 Mode = ResizeMode.Crop
21             }).Apply(i => ApplyRoundedCorners(i, cornerRadius));
22         }
23
24
25         // This method can be seen as an inline implementation of an `IImageProcessor`:
26         // (The combination of `IImageOperations.Apply()` + this could be replaced with an `IImageProcessor`)
27         private static void ApplyRoundedCorners(Image<Rgba32> img, float cornerRadius)
28         {
29             IPathCollection corners = BuildCorners(img.Width, img.Height, cornerRadius);
30
31             var graphicOptions = new GraphicsOptions(true)
32             {
33                 AlphaCompositionMode = PixelAlphaCompositionMode.DestOut // enforces that any part of this shape that has color is punched out of the background
34             };
35             // mutating in here as we already have a cloned original
36             // use any color (not Transparent), so the corners will be clipped
37             img.Mutate(x => x.Fill(graphicOptions, Rgba32.LimeGreen, corners));
38         }
39
40         private static IPathCollection BuildCorners(int imageWidth, int imageHeight, float cornerRadius)
41         {
42             // first create a square
43             var rect = new RectangularPolygon(-0.5f, -0.5f, cornerRadius, cornerRadius);
44
45             // then cut out of the square a circle so we are left with a corner
46             IPath cornerTopLeft = rect.Clip(new EllipsePolygon(cornerRadius - 0.5f, cornerRadius - 0.5f, cornerRadius));
47
48             // corner is now a corner shape positions top left
49             //lets make 3 more positioned correctly, we can do that by translating the orgional artound the center of the image
50
51             float rightPos = imageWidth - cornerTopLeft.Bounds.Width + 1;
52             float bottomPos = imageHeight - cornerTopLeft.Bounds.Height + 1;
53
54             // move it across the width of the image - the width of the shape
55             IPath cornerTopRight = cornerTopLeft.RotateDegree(90).Translate(rightPos, 0);
56             IPath cornerBottomLeft = cornerTopLeft.RotateDegree(-90).Translate(0, bottomPos);
57             IPath cornerBottomRight = cornerTopLeft.RotateDegree(180).Translate(rightPos, bottomPos);
58
59             return new PathCollection(cornerTopLeft, cornerBottomLeft, cornerTopRight, cornerBottomRight);
60         }
61   }
62 }

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

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

  3.处理二维码的BitMatrix类型

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

 1         public void WriteToStream(BitMatrix QrMatrix, ImageFormat imageFormat, Stream stream)
 2         {
 3             if (imageFormat != ImageFormat.Exif && imageFormat != ImageFormat.Icon && imageFormat != ImageFormat.MemoryBmp)
 4             {
 5                 DrawingSize size = m_iSize.GetSize(QrMatrix?.Width ?? 21);
 6                 using (Bitmap bitmap = new Bitmap(size.CodeWidth, size.CodeWidth))
 7                 {
 8                     using (Graphics graphics = Graphics.FromImage(bitmap))
 9                     {
10                         Draw(graphics, QrMatrix);
11                         bitmap.Save(stream, imageFormat);
12                     }
13                 }
14             }
15         }

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

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

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

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

转载于:https://www.cnblogs.com/niwan/p/11126239.html

.NetCore如何使用ImageSharp进行图片的生成相关推荐

  1. .NET 6使用ImageSharp给图片添加水印

    .NET 6 中,使用System.Drawing操作图片,生成解决方案或打包的时候,会有警告,意思是System.Drawing仅在 'windows' 上受支持.微软官方的解释是: System. ...

  2. android生成大分辨率图片,自动生成Android不同分辨率下的图片

    转自: http://blog..net/offbye/article/details/50012605 Android屏幕分辨率适配的图标处理比较麻烦,让UI做不同尺寸的图片也挺浪费时间的,并且容易 ...

  3. 基于对偶学习的跨领域图片描述生成

    作者丨杨敏 学校丨中科院深圳先进技术研究院助理研究员 研究方向丨NLP,数据挖掘,推荐系统 本文经授权转载自公众号「AI论道」. 恰逢 CIKM 2017召开(2017 年 11 月 6 日,新加坡) ...

  4. java生成小图片_JAVA生成缩略小图片类

    JAVA生成缩略小图片类 java.awt.image.BufferedImage是缓冲图片类主要将生成的图片对象缓冲起来:javax.imageio.ImageIO是图片IO控制类,可以将缓冲图片对 ...

  5. eoLinker-API_Shop_验证码识别与生成类API调用的代码示例合集:六位图片验证码生成、四位图片验证码生成、简单验证码识别等...

    以下示例代码适用于 www.apishop.net 网站下的API,使用本文提及的接口调用代码示例前,您需要先申请相应的API服务. 六位图片验证码生成:包括纯数字.小写字母.大写字母.大小写混合.数 ...

  6. 3d 自动生成物体_根据 2D 图片自动生成 3D 图书封面的牛逼工具

    小金子 读完需要 2分钟 速读仅需 1 分钟 大家好,我是你们的小金子. 今天要给推荐一个小众但很实用的工具,毕竟要用这个工具,你要么是图书工作者,要么就得自己写过书. 它就是一款能够根据 2D 图片 ...

  7. 最近在修改statusBar,添加几张图片.编译源码包时,一直提示无法找到R.drawable.xxxx必须手动编译下指定的图片文件生成R.

    最近在修改statusBar,添加几张图片.编译源码包时,一直提示无法找到R.drawable.xxxx  必须手动编译下指定的图片文件生成R.  $touch frameworks/base/pac ...

  8. 使用C#从图片文件生成图标ICON文件(附源文件)

    使用C#从图片文件生成图标ICON文件(附源文件) 看到网上有一些网站做图标转换工具,挺好的,所以研究了一下在C#中是如何实现的.其实很简单几行代码就可以搞定. 主要是使用System.Drawing ...

  9. 将图片快速生成其轮廓图

    本文适用于将二值图片快速生成其轮廓图并导出 工具为图片编辑软件AI 1.首先选择文件打开图片 2.依次点击嵌入.图片描摹 3.然后点击扩展 4.点击窗口.路径生成器.轮廓 5.点击对象.复合路径 6. ...

最新文章

  1. VS2008 VS2010发布网站时如何产生固定命名的 Dll 文件
  2. Android Properties 存储
  3. c/c++ 拷贝控制 构造函数的问题
  4. 干货丨吴恩达深度学习课程的思维导图总结
  5. 洛谷 P1985 翻转棋
  6. Struts2的配置文件struts.xml的模板
  7. 去哪儿-06-home-ajax
  8. jQuery+toggle
  9. jsonp 返回以前必须要再转一次json
  10. wps android 接口,Android调用WPS接口打开office类型文件
  11. 面试被问到你的优点和缺点时,该如何完美的回答
  12. mysql distance_MySql中的一些小坑
  13. AsyncTask异步加载给视频截取第一帧图片
  14. 使用grafana为zabbix绘制拓扑
  15. 正弦波的生成及混频器
  16. Mysql事务隔离与Spring
  17. dji osdk使用的一些问题
  18. Linux下软件逆向工程的介绍(一)
  19. Android Study Material Design 十 再探沉浸式
  20. java中@Repeatable的理解

热门文章

  1. Kettle安装好MYSQL驱动后报用户名密码错误
  2. rpm mysql java 驱动_Linux下安装MySQL(rpm方式)
  3. android sdk platform-tools 19.0.1,如何强制Android Studio 0.6.0使用SDK Build Tools 19.1.0
  4. android 固定比例图片裁剪插件,如何在Android中裁剪不同比例的图像?
  5. 『设计模式』我就要一个对象,你别给我这么多好不好!---单例模式
  6. 数学--数论--POJ281(线性同余方程)
  7. 计组—中央处理器(CPU)
  8. adb安装apk报错Failure [INSTALL_FAILED_INVALID_URI]
  9. 以太网RJ45 接线标准 线序(备忘)
  10. Quartus II与 ModelSim功能仿真与后仿真扫盲(转)