C#生成自定义海报

安装包

SixLabors.ImageSharp.Drawing 2.0

在这里插入图片描述
需要的字体:宋体和微软雅黑 商用的需要授权如果商业使用可以使用方正书宋、方正黑体,他们可以免费商用
方正官网

代码

using SixLabors.Fonts;
using SixLabors.ImageSharp;
using SixLabors.ImageSharp.Drawing;
using SixLabors.ImageSharp.Drawing.Processing;
using SixLabors.ImageSharp.Formats.Png;
using SixLabors.ImageSharp.PixelFormats;
using SixLabors.ImageSharp.Processing;namespace CreatePosterStu01
{internal class Program{static async Task Main(string[] args){//画布宽度int canvasWidth = 750;//画布高度int canvasHeight = 1096;//素材的宽度int posterWidth = 670;//素材的高度int posterHeight = 810;//二维码宽度int qrCodeWidth = 140;//二维码高度int qrCodeHeight = 140;//头像宽度和高度int avatorWidth = 110;int avatorHeight = 110;//昵称var nickName = "假装wo不帅";//签名,个性签名var diySign = "\"这个真不错,推荐你也来看看啊啊啊sdf\"";var imgName = $"{DateTime.Now.ToString("yyyy_MM_dd_HH_mm_ss")}.png";using (Image<Rgba32> image = new Image<Rgba32>(canvasWidth, canvasHeight, Color.White)){//绘制顶部图片var topImage = Image.Load("images/main.jpg");//也可以加载stream//var qrCodeImage = Image.Load(data);//改变显示区域的大小,并不能改变图片大小//var posterRect = new Rectangle(0,0, posterWidth, posterHeight);//image.Mutate(t => t.DrawImage(topImage, new Point(40, 40), posterRect, 1f));//存放海报位置//KnownResamplers.Bicubic 获取实现双三次核算法W(x)的双三次采样器//KnownResamplers.Box 获取实现盒算法的盒采样器。类似于升级时的最近邻居。缩小像素时,会对像素进行平均,将像素合并在一起。topImage.Mutate(x => x.Resize(posterWidth, posterHeight, KnownResamplers.Box));image.Mutate(t => t.DrawImage(topImage, new Point(40, 40), 1f));//存放二维码var qrcodeImage = Image.Load("images/qrcode.jpg");qrcodeImage.Mutate(x => x.Resize(qrCodeWidth, qrCodeHeight, KnownResamplers.Box));image.Mutate(t => t.DrawImage(qrcodeImage, new Point(560, 900), 1f));//存放头像var avatorImage = Image.Load("images/avator.jpg");//转化为圆角,此时有黑色边框avatorImage.Mutate(x => x.Resize(avatorWidth, avatorHeight));//avatorImage.Mutate(x => x.ConvertToAvatar(new Size(avatorWidth, avatorHeight), (avatorWidth / 2.0f)));image.Mutate(t => t.DrawImage(avatorImage, new Point(40, 915), 1f));//显示昵称FontCollection fonts = new FontCollection();var songtiFamily = fonts.Add("fonts/simsun.ttf");var yaheiFamily = fonts.Add("fonts/weiruanyahei.ttf");image.Mutate(t => t.DrawText(nickName, new Font(yaheiFamily, 15 * 2, FontStyle.Bold), Color.ParseHex("#000000"), new PointF(160, 940)));//显示签名//判断长度决定是否显示...,目前一行最多16个字,超出部分显示...if (diySign.Length > 16){diySign = diySign.Remove(15, diySign.Length - 15) + "...";}image.Mutate(t => t.DrawText(diySign, new Font(yaheiFamily, 13 * 2, FontStyle.Bold), Color.ParseHex("#cccccc"), new PointF(160, 985)));var fileStream = File.Create(imgName);await image.SaveAsync(fileStream, new PngEncoder());//也可以保存为文件流,web端使用/*using (var stream = new MemoryStream()){await image.SaveAsync(stream, new PngEncoder());stream.Position = 0; return stream;}*/}await Console.Out.WriteLineAsync("完成~~");}}/// <summary>/// https://github.com/SixLabors/Samples/blob/main/ImageSharp/AvatarWithRoundedCorner/Program.cs/// </summary>public static class Helper{// Implements a full image mutating pipeline operating on IImageProcessingContextpublic static IImageProcessingContext ConvertToAvatar(this IImageProcessingContext context, Size size, float cornerRadius){return context.Resize(new ResizeOptions{Size = size,Mode = ResizeMode.Crop}).ApplyRoundedCorners(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 IImageProcessingContext ApplyRoundedCorners(this IImageProcessingContext context, float cornerRadius){Size size = context.GetCurrentSize();IPathCollection corners = BuildCorners(size.Width, size.Height, cornerRadius);context.SetGraphicsOptions(new GraphicsOptions(){Antialias = true,// Enforces that any part of this shape that has color is punched out of the background//强制将此形状中任何有颜色的部分从背景中冲压出来AlphaCompositionMode = PixelAlphaCompositionMode.DestOut});// Mutating in here as we already have a cloned original// use any color (not Transparent), so the corners will be clipped//在这里突变,因为我们已经有了一个克隆的原始使用任何颜色(非透明),所以角将被剪切foreach (IPath path in corners){context = context.Fill(Color.Red, path);}return context;}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// let's make 3 more positioned correctly, we can do that by translating the original around 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 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);}}
}

结果

在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

redis-设置从节点

节点结构 节点配置文件 主节点 不变 6380节点 port 6380 slaveof 127.0.0.1 63796381节点 port 6381 slaveof 127.0.0.1 6380启动 指定配置文件的方式启动 D:\jiqun\redis\Redis-6380>redis-server.exe redis.windows.conf启动时&#xff0c;会触发同步数据命令 主节点…

安装ipfs-swarm-key-gen

安装ipfs-swarm-key-gen Linux安装go解释器安装ipfs-swarm-key-gen Linux安装go解释器 https://blog.csdn.net/omaidb/article/details/133180749 安装ipfs-swarm-key-gen # 编译ipfs-swarm-key-gen二进制文件 go get -u github.com/Kubuxu/go-ipfs-swarm-key-gen/ipfs-swarm…

insightface实战:画出嘴巴和眼睛的mask

今天的目标是将人脸的嘴巴和眼睛区域抠出来&#xff0c;使用insightface简单实现出来&#xff0c;为了方便批量使用多进程跑数据&#xff0c;使用多进程的方式&#xff0c;下面是代码&#xff1a; import os import cv2 from multiprocessing import Pool import numpy as n…

Visual Studio 2019 C# winform CefSharp 中播放视频及全屏播放

VS C# winform CefSharp 浏览器控件&#xff0c;默认不支持视频播放&#xff0c;好在有大佬魔改了dll&#xff0c;支持流媒体视频播放。虽然找了很久&#xff0c;好歹还是找到了一个版本100.0.230的dll&#xff08;资源放在文末&#xff09; 首先创建一个项目 第二、引入CefSha…

排序:归并(Merge)排序算法分析

1.归并操作 归并:把两个或多个已经有序的序列合并成一个。 2路归并&#xff1a;二合一k路归并&#xff1a;k合一结论:m路归并&#xff0c;每选出一个元素需要对比关键字m-1次。 2.算法思想 核心操作:把数组内的两个有序序列归并为一个。 例如&#xff1a; 3.代码实现 将…

什么是大数据可视化

在互联网高速发展的当今&#xff0c;5G的兴起加速了数据传输的速度&#xff1b;与此同时&#xff0c;智能物联网如智慧家电、可穿戴设备等产品的火热&#xff0c;进一步扩充了数据获取的渠道。不仅仅在网页上、手机和电脑应用上以秒计产生海量数据&#xff0c;智能设备同时也在…

04. 人工智能核心基础 - 导论(3)

文章目录 人工智能和其他学科的关系为什么学习人工智能怎么学好人工智能&#xff1f;一些问题 Hi&#xff0c;你好。我是茶桁。 基于上一节课咱们的整体强度有点大&#xff0c;而且咱们马上也要进入高强度内容了&#xff0c;那么这一篇咱们就稍微水一篇吧。来聊聊天&#xff0…

Nginx环境搭建、负载均衡测试

Nginx环境搭建、负载均衡测试 系统环境&#xff1a; win10&#xff0c;IDEA2020&#xff0c;JDK8 一、nginx环境搭建 1.ngxin下载 Nginx官网下载&#xff1a; http://nginx.org/en/download.html Nginx有三种版本&#xff0c;分别是Mainline version&#xff08;开发版&…

怒刷LeetCode的第19天(Java版)

目录 第一题 题目来源 题目内容 解决方法 方法一&#xff1a;遍历一次数组 方法二&#xff1a;贪心算法 方法三&#xff1a;双指针 第二题 题目来源 题目内容 解决方法 方法一&#xff1a;动态规划 方法二&#xff1a;贪婪算法 方法三&#xff1a;正则表达式 第…

玄子Share 设计模式 GOF 全23种 + 七大设计原则

玄子Share 设计模式 GOF 全23种 七大设计原则 前言&#xff1a; 此文主要内容为 面向对象七大设计原则&#xff08;OOD Principle&#xff09;GOF&#xff08;Gang Of Four&#xff09;23种设计模式拓展的两个设计模式 简单工厂模式&#xff08;Simple Factory Pattern&#x…

基于Java实现的仓库管理系统设计与实现(源码+lw+部署文档+讲解等)

文章目录 前言功能介绍&#xff1a;具体实现截图论文参考详细视频演示为什么选择我自己的网站自己的小程序&#xff08;小蔡coding&#xff09;有保障的售后福利 代码参考源码获取 前言 &#x1f497;博主介绍&#xff1a;✌全网粉丝10W,CSDN特邀作者、博客专家、CSDN新星计划导…

解密PDF密码

PDF文件有两种密码&#xff0c;一个打开密码、一个限制编辑密码&#xff0c;因为PDF文件设置了密码&#xff0c;那么打开、编辑PDF文件就会受到限制。忘记了PDF密码该如何解密&#xff1f; PDF和office一样&#xff0c;可以对文件进行加密&#xff0c;但是没有提供恢复密码的功…

智能驾驶、智能家居、智能工业中的 AI 关键基础设施,半导体厂商恩智浦的角色是什么?

我们来看一条七年前的真实新闻报道&#xff0c;2016 年《福布斯》在报道中提到“2020 年会有 1000 万台的自动驾驶汽车”。然而 2023 年的现在&#xff0c;真正实现 L4 级别自动驾驶的汽车&#xff0c;仍然远远没有达到这个预测的数量。 另一边&#xff0c;数据显示&#xff0c…

【数据结构】排序算法(一)—>插入排序、希尔排序、选择排序、堆排序

&#x1f440;樊梓慕&#xff1a;个人主页 &#x1f3a5;个人专栏&#xff1a;《C语言》《数据结构》《蓝桥杯试题》《LeetCode刷题笔记》《实训项目》 &#x1f31d;每一个不曾起舞的日子&#xff0c;都是对生命的辜负 目录 前言 1.直接插入排序 2.希尔排序 3.直接选择排…

使用不同尺寸的传感器拍照时,怎么保证拍出同样视场范围的照片?

1、问题背景 使用竞品机做图像效果对比时&#xff0c;我们通常都会要求拍摄的照片要视场范围一致&#xff0c;这样才具有可比性。之前我会考虑用同样焦距、同样分辨率的设备去拍照对比就可以了&#xff0c;觉得相机的视场范围只由镜头焦距来决定。 但如果对于不同尺寸的传感器…

使用 Matter-SDK 快速搭建 Matter 环境 (Linux)

Matter 作为一个统一的智能家居互联协议&#xff0c;凭借其高兼容性的特点&#xff0c;正逐渐打破各个智能家居之间的壁垒。乐鑫作为在 Matter 项目发布之初的早期成员&#xff0c;提供了一套开源、完整、易用的 Matter-SDK。 乐鑫的 Matter-SDK 是建立在开源 Matter-SDK 之上…

IOTE 2023盛况回顾,美格智能聚连接之力促数字新生长

9月20~22日&#xff0c;IOTE国际物联网展深圳站在深圳国际会展中心正式召开。本届展会以“IoT构建数字经济底座”为主题&#xff0c;聚焦物联网技术助推数字经济发展的核心动力。美格智能携前沿技术成果亮相展会&#xff0c;与参展观众深入交流。 展会上&#xff0c;美格智能带…

大型企业网如何部署NAT实现需求

1.企业中堕胎电脑如何共享上网&#xff1f; 2.NAT地址转换原理讲解&#xff1b; 3.企业机房如何用NAT让服务器更安全&#xff1f; - NAT - 网络地址转换 - 什么式网络地址 IP地址 -通信时候的设备标识 - 为什么要把IP地址做转换呢&#xff1f; -- 公网IP&#xff…

什么是推挽电路?

推挽电路原理&#xff1a; 可以简单理解为推和拉&#xff1b; 此电路总共用到两个元器件&#xff0c;对应图中的Q1----NPN三极管&#xff0c;Q2----PNP三极管&#xff0c;两个电阻R1和R2起到限流的作用&#xff1b;两个三极管的中间对应信号的输出。 下面就举例说明是如何工作的…

【计算机网络】图解路由器(一)

本系列包含&#xff1a; 图解路由器&#xff08;一&#xff09;图解路由器&#xff08;二&#xff09; 图解路由器&#xff08;一&#xff09; 1、什么是路由器&#xff1f;2、什么是路由选择&#xff1f;3、什么是转发&#xff1f;4、路由器设备有哪些类型&#xff1f;5、根据…