C# net6使用ImageSharp绘图并展示

news/2024/12/21 22:12:41/

目录

  • winform实现
    • 1.新建窗体程序,使用net 6框架
    • 2.使用Nuget安装相关程序包,SixLabors.ImageSharp和SixLabors.ImageSharp.Drawing(这个使用的是预发行版)
    • 3.在项目根目录中放置字体文件(*.ttf,设置文件属性—复制到输出目录—始终复制)
    • 4.在项目根目录中新建文件保存路径
    • 5.主要生成代码
  • blazor server实现
    • 1.新建Blazor Server项目
    • 2.使用Nuget安装相关程序包,SixLabors.ImageSharp和SixLabors.ImageSharp.Drawing(这个使用的是预发行版)
    • 3.在wwwroot中放置字体文件
    • 4.修改Index.razor文件,准备实现生成图片,字体按照相对路径可以进行寻找
    • 5.可以正常保存,生成相关图片
  • blazor webAssembly 实现
    • 1.新建项目
    • 2.使用Nuget安装相关程序包,SixLabors.ImageSharp和SixLabors.ImageSharp.Drawing(这个使用的是预发行版)
    • 3.在wwwroot中放置字体文件
    • 4.修改Index.razor文件,准备实现生成图片,同样的代码,使用上面的那种方式,总是找不到路径,不太理解其运行机制。

研究这个的最初目的是,使用net 6做blazor网站,希望在登录界面实现验证码生成功能,因一直找不到字体文件,所以切换项目实验一下。

winform实现

1.新建窗体程序,使用net 6框架

2.使用Nuget安装相关程序包,SixLabors.ImageSharp和SixLabors.ImageSharp.Drawing(这个使用的是预发行版)

3.在项目根目录中放置字体文件(*.ttf,设置文件属性—复制到输出目录—始终复制)

4.在项目根目录中新建文件保存路径

5.主要生成代码

private void button1_Click(object sender, EventArgs e){pictureBox1.Image = null;int codeW = 100;int codeH = 36;int fontSize = 32;string chkCode = string.Empty;SixLabors.ImageSharp.Color[] color = { SixLabors.ImageSharp.Color.Black, SixLabors.ImageSharp.Color.Red, SixLabors.ImageSharp.Color.Blue, SixLabors.ImageSharp.Color.Green, SixLabors.ImageSharp.Color.Orange, SixLabors.ImageSharp.Color.Brown, SixLabors.ImageSharp.Color.DarkBlue };//string[] font = { "Times New Roman" };//需要将字体放到项目中string[] fonts = { "Arial.ttf" };char[] character = { '1', '2', '3', '4', '5', '6', '7', '8', '9', 'a', 'b', 'd', 'e', 'f', 'h', 'k', 'm', 'n', 'r', 'x', 'y', 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'J', 'K', 'L', 'M', 'N', 'P', 'R', 'S', 'T', 'W', 'X', 'Y' };//生成验证码字符串Random rnd = new Random();for (int i = 0; i < 4; i++){chkCode += character[rnd.Next(character.Length)];}//写入Session用于验证码校验,可以对校验码进行加密,提高安全性//System.Web.HttpContext.Current.Session["verifyCode"] = chkCode;try{//创建画布var image = new Image<Rgba32>(codeW, codeH);image.Mutate(x => x.BackgroundColor(SixLabors.ImageSharp.Color.White));//Bitmap bmp = new Bitmap(codeW, codeH - 3);//Graphics g = Graphics.FromImage(bmp);//填充背景颜色为白色//g.Clear(Color.White);//画噪线for (int i = 0; i < 3; i++){int x1 = rnd.Next(codeW);int y1 = rnd.Next(codeH);int x2 = rnd.Next(codeW);int y2 = rnd.Next(codeH);image.Mutate(x => x//画实线.DrawLines(color[rnd.Next(color.Length)], //字体颜色1,   //字体大小new SixLabors.ImageSharp.PointF[]{new Vector2(x1, y1),new Vector2(x2, y2)} //两点一线坐标));//Color clr = color[rnd.Next(color.Length)];//g.DrawLine(new Pen(clr), x1, y1, x2, y2);}//画验证码//string bPath = $"{Directory.GetCurrentDirectory()}font/";//string bPath = "C:\\Windows\\Fonts";for (int i = 0; i < chkCode.Length; i++){string fnt = fonts[rnd.Next(fonts.Length)];//var install_Family = new FontCollection().Add(System.IO.Path.Combine(bPath, fnt));var fontTmp = new FontCollection();//var bPath = Environment.CurrentDirectory;//var install_Family = fontTmp.Add($"font/ARIAL.TTF");//var install_Family = fontTmp.Add($"ARIAL.TTF");var install_Family = fontTmp.Add($"./font/Arial.ttf");//var install_Family = fontTmp.Add($"C:/Windows/Fonts/ARIAL.TTF");//var install_Family = fontTmp.Add($"C:/Windows/Fonts/Arial/ARIAL.TTF");var font = new SixLabors.Fonts.Font(install_Family, fontSize);image.Mutate(x => x.DrawText(chkCode[i].ToString(),   //文字内容font,color[rnd.Next(color.Length)],new Vector2((float)i * 20, (float)0)));//将文字写到画布上//Font ft = new Font(fnt, fontSize);//   Color clr = color[rnd.Next(color.Length)];//   g.DrawString(chkCode[i].ToString(), ft, new SolidBrush(clr), (float)i * 18, (float)0);}//画图片的前景噪音点for (int i = 0; i < 15; i++){int x1 = rnd.Next(codeW);int y1 = rnd.Next(codeH);int x2 = x1 + 2;int y2 = y1 + 2;image.Mutate(x => x//画实线.DrawLines(color[rnd.Next(color.Length)], //字体颜色2,   //字体大小new SixLabors.ImageSharp.PointF[]{new Vector2(x1, y1),new Vector2(x2, y2)} //两点一线坐标));}//SixLabors.ImageSharp.Formats.Png.PngTextData//IImageFormat bFormat = new Formats;//ImgStr = image.ToBase64String(SixLabors.ImageSharp.Formats.Png.PngFormat.Instance);image.SaveAsJpeg($"./img/test.jpg");System.Drawing.Image bImg = System.Drawing.Image.FromFile($"./img/test.jpg");pictureBox1.Image = bImg;}catch (Exception ex){string aMsg = ex.Message;}}

blazor server实现

1.新建Blazor Server项目

2.使用Nuget安装相关程序包,SixLabors.ImageSharp和SixLabors.ImageSharp.Drawing(这个使用的是预发行版)

3.在wwwroot中放置字体文件

4.修改Index.razor文件,准备实现生成图片,字体按照相对路径可以进行寻找

@page "/"
@using SixLabors.Fonts;
@using SixLabors.ImageSharp.Drawing.Processing;
@using System.Numerics;<PageTitle>ImageSharp生成图片</PageTitle><button @onclick=CreateImg>生成图片</button>
<img src="@ImgStr"/>
<div>@Yzm</div>
@code{public string ImgStr;public string Yzm;public void CreateImg(){int codeW = 100;int codeH = 36;int fontSize = 32;string chkCode = string.Empty;SixLabors.ImageSharp.Color[] color = { SixLabors.ImageSharp.Color.Black, SixLabors.ImageSharp.Color.Red, SixLabors.ImageSharp.Color.Blue, SixLabors.ImageSharp.Color.Green, SixLabors.ImageSharp.Color.Orange, SixLabors.ImageSharp.Color.Brown, SixLabors.ImageSharp.Color.DarkBlue };//string[] font = { "Times New Roman" };//需要将字体放到项目中string[] fonts = { "Arial.ttf" };char[] character = { '1', '2', '3', '4', '5', '6', '7', '8', '9', 'a', 'b', 'd', 'e', 'f', 'h', 'k', 'm', 'n', 'r', 'x', 'y', 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'J', 'K', 'L', 'M', 'N', 'P', 'R', 'S', 'T', 'W', 'X', 'Y' };//生成验证码字符串Random rnd = new Random();for (int i = 0; i < 4; i++){chkCode += character[rnd.Next(character.Length)];}//写入Session用于验证码校验,可以对校验码进行加密,提高安全性//System.Web.HttpContext.Current.Session["verifyCode"] = chkCode;try{//创建画布var image = new Image<Rgba32>(codeW, codeH);image.Mutate(x => x.BackgroundColor(SixLabors.ImageSharp.Color.White));//Bitmap bmp = new Bitmap(codeW, codeH - 3);//Graphics g = Graphics.FromImage(bmp);//填充背景颜色为白色//g.Clear(Color.White);//画噪线for (int i = 0; i < 3; i++){int x1 = rnd.Next(codeW);int y1 = rnd.Next(codeH);int x2 = rnd.Next(codeW);int y2 = rnd.Next(codeH);image.Mutate(x => x//画实线.DrawLines(color[rnd.Next(color.Length)], //字体颜色1,   //字体大小new SixLabors.ImageSharp.PointF[]{new Vector2(x1, y1),new Vector2(x2, y2)} //两点一线坐标));//Color clr = color[rnd.Next(color.Length)];//g.DrawLine(new Pen(clr), x1, y1, x2, y2);}//画验证码//string bPath = $"{Directory.GetCurrentDirectory()}font/";//string bPath = "C:\\Windows\\Fonts";for (int i = 0; i < chkCode.Length; i++){string fnt = fonts[rnd.Next(fonts.Length)];//var install_Family = new FontCollection().Add(System.IO.Path.Combine(bPath, fnt));var fontTmp = new FontCollection();//var bPath = Environment.CurrentDirectory;//var install_Family = fontTmp.Add($"font/ARIAL.TTF");//var install_Family = fontTmp.Add($"ARIAL.TTF");var install_Family = fontTmp.Add($"./wwwroot/font/Arial.ttf");//var install_Family = fontTmp.Add($"C:/Windows/Fonts/ARIAL.TTF");//var install_Family = fontTmp.Add($"C:/Windows/Fonts/Arial/ARIAL.TTF");var font = new SixLabors.Fonts.Font(install_Family, fontSize);image.Mutate(x => x.DrawText(chkCode[i].ToString(),   //文字内容font,color[rnd.Next(color.Length)],new Vector2((float)i * 20, (float)0)));//将文字写到画布上//Font ft = new Font(fnt, fontSize);//   Color clr = color[rnd.Next(color.Length)];//   g.DrawString(chkCode[i].ToString(), ft, new SolidBrush(clr), (float)i * 18, (float)0);}//画图片的前景噪音点for (int i = 0; i < 15; i++){int x1 = rnd.Next(codeW);int y1 = rnd.Next(codeH);int x2 = x1 + 2;int y2 = y1 + 2;image.Mutate(x => x//画实线.DrawLines(color[rnd.Next(color.Length)], //字体颜色2,   //字体大小new SixLabors.ImageSharp.PointF[]{new Vector2(x1, y1),new Vector2(x2, y2)} //两点一线坐标));}//SixLabors.ImageSharp.Formats.Png.PngTextData//IImageFormat bFormat = new Formats;//ImgStr = image.ToBase64String(SixLabors.ImageSharp.Formats.Png.PngFormat.Instance);//保存成文件//image.SaveAsJpeg($"./wwwroot/img/test.jpg");//保存成base64字符串using var memoryStream = new MemoryStream();image.Save(memoryStream, SixLabors.ImageSharp.Formats.Png.PngFormat.Instance);var base64String = Convert.ToBase64String(memoryStream.ToArray());ImgStr = $"data:image/jpeg;base64,{base64String}";Yzm = chkCode;}catch (Exception ex){string aMsg = ex.Message;}}}

5.可以正常保存,生成相关图片

blazor webAssembly 实现

1.新建项目

2.使用Nuget安装相关程序包,SixLabors.ImageSharp和SixLabors.ImageSharp.Drawing(这个使用的是预发行版)

3.在wwwroot中放置字体文件

4.修改Index.razor文件,准备实现生成图片,同样的代码,使用上面的那种方式,总是找不到路径,不太理解其运行机制。


http://www.ppmy.cn/news/90153.html

相关文章

外包实在是太坑了,干了三年,感觉人都废了

先说一下自己的情况&#xff0c;专科生&#xff0c;19年通过校招进入杭州某个外包软件公司&#xff0c;干了接近3年的功能测试&#xff0c;今年年初&#xff0c;感觉自己不能够在这样下去了&#xff0c;长时间呆在一个舒适的环境会让一个人堕落! 而我已经在一个企业干了3年的功…

智能排班系统 【管理系统功能、操作说明——上篇】

文章目录 功能设计共有功能系统管理员企业管理员门店管理员门店员工 页面与功能展示用户登录企业注册系统首页系统管理员首页企业管理员首页门店管理员首页 个人中心菜单管理日志管理登录日志 功能设计 不同的角色关注的任务和功能不同&#xff0c;针对不同的角色&#xff0c;…

sentinel原理分析及源码剖析

sentinel功能 sentinel功能可参考官网 可以从sentinel的dashboard中了解到sentinel的核心功能包括 流控规则 阈值类型&#xff1a;QPS、并发线程数流控模式&#xff1a;直接&#xff0c;关联&#xff0c;链路流控效果&#xff1a;快速失败&#xff08;滑动时间窗算法Default…

SQL注入 - Part 2

SQL注入 - Part 2 1.sql注入自动化工具--sqlmap配置环境变量/快捷方式一些sqlmap的常用语句前置SQL知识batch批量注入 2.sql注入靶场——sqlilabs3.布尔盲注4.基于时间的盲注5.基于报错的注入总结 1.sql注入自动化工具–sqlmap 配置环境变量/快捷方式 最终效果&#xff1a; …

AI绘图学习心得分享-Midjourney绘画AI,让你少走一些弯路

本教程收集于:AIGC从入门到精通教程 AI绘图学习心得分享-Midjourney绘画AI,让你少走一些弯路 本篇没有什么长篇大论,全部都是实用心得总结。接下来,我们将分享关于Midjourney绘画AI的实用心得总结,包括构图指令结构、常用指令、操作技巧、常用风格词汇和构图词汇。 如果…

线程池总结

1.JDK Executors线程池 2.JDK提供哪些默认的实现 newFixedThreadPoolnewCachedThreadPoolnewSingleThreadExecutor 3.为什么不允许使用默认实现 会OOM 4.介绍一下自定义线程池的几个常用参数&#xff0c;几个参数的值怎么定 5.线程池里的任务是IO密集型还是计算密集型 6…

Docker实战1-运行前端Vue项目

本次运行了两个项目&#xff0c;一个是开源的镜像&#xff0c;一个是自己的前端项目镜像 1 在docker中运行 keycloak docker run -p 8080:8080 -e KEYCLOAK_ADMINadmin -e KEYCLOAK_ADMIN_PASSWORDadmin quay.io/keycloak/keycloak:21.1.1 start-dev 这个最简单了&#xff0c…

audio标签事件

audio在音乐播放上用的频率极高&#xff0c;后来自己就查阅资料和度娘来总结了一下audio的JS事件&#xff1a; play:音频或视频文件已经就绪可以开始播放时触发 playing:音频或视频已开始播放时触发 ended:音频或视频文件播放完毕后触发 pause:音频或视频文件暂停时触发 ratech…