Net6 用imagesharp 实现跨平台图片处理并存入oss

项目要求:生成电子证书

一、模板文件在OSS中,直接加载

二、向模板文件添加二维码

三、向模板文件添加多行文字

四、生成二维码,存入本地,

五、向模板文件添加二维码

代码实现步骤

一、建立.net 6 API项目,安装Nuget包

TestImageShapForNet6API

二、配置好OSS的相关功能,包括OSS绑定域名,配置SSL证书等,保证模板文件可以以URL的模式显示在浏览器中

http://oss.crabstech.com/code/21122504.jpg

获取OSS的AK信息和存储权限,以保证文件的正常读取和存入

三、创建内容行的model

using SixLabors.Fonts;namespace TestImageShapForNet6API
{public class DrawContent{public int x { get; set; } public int y { get; set; } public Font font { get; set; } = null!;public string Text { get; set; } = null!;public Color color { get; set; } = Color.Black;}
}

四、创建OSS处理类(阿里云OSS ,具体文档请参考阿里云)

using Aliyun.OSS;namespace TestImageShapForNet6API
{public class OssHandle{const string Endpoint = "oss-cn-zhangjiakou.aliyuncs.com";const string AccessKeyId = "你的keyId";const string AccessKeySecret = "你的keysecret";const string BucketName = "你的bucketname";const string DirName = "自己起的目录名";const string Url = "你自己的bucket绑定的域名";public string PutImg2Oss(byte[] image,string objName){var _img = new MemoryStream(image);var client = new OssClient(Endpoint,AccessKeyId, AccessKeySecret);try{var res = client.PutObject(BucketName, $"{DirName}/{objName}", _img);Console.WriteLine(res.ToString);}catch(Exception ex){Console.WriteLine(ex.Message);}return $"{Url}{DirName}/{objName}";}}
}

五、生成二维码

using ZXing.QrCode;
using ZXing;namespace TestImageShapForNet6API
{public class QrFile{public async Task<string> Output(string text){var basePath = AppContext.BaseDirectory;var filePath = Path.Combine(basePath, $"images/qr.jpg");//生成二维码var writer = new ZXing.ImageSharp.BarcodeWriter<Rgba32>{Format = BarcodeFormat.QR_CODE,Options = new QrCodeEncodingOptions{Width = 400,Height = 400,Margin = 2,}};var image = writer.WriteAsImageSharp<Rgba32>(text);await image.SaveAsync(filePath);Console.WriteLine("Image success");return filePath;}}
}

六、创建合并方法,和调用方法。注意:“/”的问题,windows下对"/"和"\"容忍度比较高,怎么写基本都可以找到路径。但linux下一定要写 "/",否则会找不到文件

using SixLabors.Fonts;
using SixLabors.ImageSharp.Drawing.Processing;
using System.Net;namespace TestImageShapForNet6API
{public class MergeImg{/// <summary>/// 图片上写字/// https://docs.sixlabors.com/articles/imagesharp.drawing/gettingstarted.html#expanded-example/// </summary>/// <param name="ImagePath"></param>/// <param name="x"></param>/// <param name="y"></param>/// <param name="txt"></param>/// <param name="fontPath"></param>/// <returns></returns>private Image? drawingTextOnImage(string url, string qrImgPath, List<DrawContent> contList){if (string.IsNullOrWhiteSpace(url) || contList is null || contList.Count < 1)return null;// 线上地址的图片,通过获取流的方式读取   WebRequest imgRequest = WebRequest.Create(url);var res = (HttpWebResponse)imgRequest.GetResponse();// 加载图片var image = Image.Load(res.GetResponseStream());// 按行向图片写入文字foreach (var item in contList){PointF point = new PointF(item.x, item.y);image.Mutate(x => x.DrawText(item.Text, item.font, item.color, point));}// 加载二维码图片var qrImg = Image.Load(qrImgPath);// 向图片上添加二维码image.Mutate(x => x.DrawImage(qrImg, new Point(1650, 3600), 1));return image;}public async Task<string> DrawingTextOnImage(){var basePath = AppDomain.CurrentDomain.BaseDirectory;            var url = "http://oss.crabstech.com/code/21122504.jpg";var qrImgPath = $"{basePath}images/qr.jpg";var imgPath = $"{basePath}images/temp.jpg";var contList = new List<DrawContent>();var _first = new DrawContent{x = 600,y = 1600,Text = "张小斐",font = SystemFonts.CreateFont("SimHei", 160, FontStyle.Regular),color = Color.Green};contList.Add(_first);var img = drawingTextOnImage(url, qrImgPath, contList);var ms = new MemoryStream();img.SaveAsJpeg(ms);Console.WriteLine("生成成功");var _imgMs = ms.ToArray();var ossHandler = new OssHandle();var result = await Task.Run(()=>{return ossHandler.PutImg2Oss(_imgMs, "code-01.jpg");});return result;}}
}

七、创建controller ,调用方法实现

完整的program.cs

using TestImageShapForNet6API;var builder = WebApplication.CreateBuilder(args);var basePath = AppContext.BaseDirectory;
builder.Services.AddControllers();// Add services to the container.
// Learn more about configuring Swagger/OpenAPI at https://aka.ms/aspnetcore/swashbuckle
builder.Services.AddEndpointsApiExplorer();
builder.Services.AddSwaggerGen();var app = builder.Build();app.UseStaticFiles();// Configure the HTTP request pipeline.
if (app.Environment.IsDevelopment())
{}
app.UseSwagger();
app.UseSwaggerUI();app.MapGet("/qrcode", async () => {var _qr = new QrFile();return await _qr.Output("http://oss.crabstech.com/han/6d9a492bf72f4dc2bf59154c8c603c85_2.png");
})
.WithName("QrCode");app.MapGet("/merimg", async () =>
{var img = new MergeImg();return await img.DrawingTextOnImage();
})
.WithName("MergeImg");app.Run();

本地启动

先调用一次qrcode,再调用一次merimg。(只是为了测试两个API都可以单独使用,实际项目中请按照正常逻辑布署)

执行后我们得到了oss的Url地址:https://oss.crabstech.com/code/code-01.jpg

将地址粘贴到浏览器,得到已合成的图片文件

八、添加DockerFile

在项目中添加fonts文件夹,从c:\windows\fonts中拷贝基础的几个字体文件到项目的fonts中

在项目上点右键

 

 此时生成Dockerfile文件

 点击Dockerfile编辑

#See https://aka.ms/customizecontainer to learn how to customize your debug container and how Visual Studio uses this Dockerfile to build your images for faster debugging.FROM mcr.microsoft.com/dotnet/aspnet:6.0 AS base
WORKDIR /app
EXPOSE 80#设置时间为中国上海
ENV TZ=Asia/Shanghai
ENV DEBIAN_FRONTEND noninteractive# 设置包源为阿里
RUN  sed -i s@/archive.ubuntu.com/@/mirrors.aliyun.com/@g  /etc/apt/sources.list \
&& apt-get clean# 安装 tzdata 软件包
RUN apt-get update \
&& apt-get install -y tzdata \
&& ln -fs /usr/share/zoneinfo/$TZ  /etc/localtime \
&& rm -rf /var/lib/apt/lists/ \
&& dpkg-reconfigure -f noninteractive tzdata# 安装字体 注意:“/”的问题,windows下对"/"和"\"容忍度比较高,怎么写基本都可以找到路径。但linux下一定要写 "/",否则会找不到文件
COPY ["TestImageShapForNet6API/fonts/ARIAL.TTF","/usr/share/fonts/ttf-dejavu/ARIAL.TTF"]
COPY ["TestImageShapForNet6API/fonts/SIMFANG.TTF","/usr/share/fonts/ttf-dejavu/SIMFANG.TTF"]
COPY ["TestImageShapForNet6API/fonts/SIMHEI.TTF","/usr/share/fonts/ttf-dejavu/SIMHEI.TTF"]
COPY ["TestImageShapForNet6API/fonts/SIMKAI.TTF","/usr/share/fonts/ttf-dejavu/SIMKAI.TTF"]
COPY ["TestImageShapForNet6API/fonts/SIYUANSONGTI.TTF","/usr/share/fonts/ttf-dejavu/SIYUANSONGTI.TTF"]FROM mcr.microsoft.com/dotnet/sdk:6.0 AS build
WORKDIR /src
COPY ["TestImageShapForNet6API/TestImageShapForNet6API.csproj", "TestImageShapForNet6API/"]
RUN dotnet restore "TestImageShapForNet6API/TestImageShapForNet6API.csproj"
COPY . .
WORKDIR "/src/TestImageShapForNet6API"
RUN dotnet build "TestImageShapForNet6API.csproj" -c Release -o /app/buildFROM build AS publish
RUN dotnet publish "TestImageShapForNet6API.csproj" -c Release -o /app/publish /p:UseAppHost=falseFROM base AS final
WORKDIR /app
COPY --from=publish /app/publish .ENTRYPOINT ["dotnet", "TestImageShapForNet6API.dll"]

再次点击右键,选择容器业务流程协调程序

 点击编辑

 

version: '3.4'services:testimageshapfornet6api:image: imagehandle:20231012.01build:context: "./TestImageShapForNet6API"dockerfile: "./TestImageShapForNet6API/Dockerfile"container_name: "imagehandle"ports: - 20205:80 - 20206:443volumes:- "./config/appsettings.json:/app/appsettings.json" environment:- ASPNETCORE_ENVIRONMENT=Productionrestart: always 

这里注意以下三点

 

至此在本地要准备的内容准备完毕

下面是在宝塔中操作的内容

一、在文件中找个地方创建个文件夹,一般放在以下这个地方

 

创建并打开文件夹,将项目文件压缩为zip后上传(压缩前记得编译生成一次),压缩时要选择最项目最外层文件夹,保证zip文件完整性

将文件上传到文件夹下,进行解压缩。

并且在该文件夹下建立config文件,将项目的appsetting.json拷贝到config下

将docker-compose.yml文件,拷贝到该目录下

解压拷贝完成后的目录状态如下

 

在该目录下的终端里,执行部署 

docker-compose -f docker-compose.yml up

发布成功,是这样的 

 

此时可以关闭这个终端,开一个新的终端查看

docker ps

或者在宝塔的Docker中查看

下面需要建立网站来映射docker

在宝塔中正常添加网站,绑定域名

然后修改配置文件

server
{listen 80;server_name 你的域名(确保已经解析到当前服务器了);index index.html index.htm index.aspx ;location / {proxy_pass http://localhost:20205; #这里的端口号就是docker发布时,左侧的端口号}}

至此项目发布完毕

如果此时访问域名,显示404,不要慌,在域名后添加/swagger/index.html

即:http://你的域名/swagger/index.html

在oss中查看文件存储的时间,确定是刚刚生成无误

至此项目需求完成

项目下载地址

在.net 6下用SixLabors.ImageSharp实现图片跨平台处理icon-default.png?t=N7T8https://gitee.com/shirleycat/image-sharp-for-net6-api

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

城市消防无人机控制系统的设计

目录 摘 要......................................................................................................................... 2 第一章 绪论.............................................................................................................…

【Java 进阶篇】JavaScript 正则表达式(RegExp)详解

JavaScript 正则表达式&#xff0c;通常简写为 RegExp&#xff0c;是一种强大的文本匹配工具&#xff0c;它允许你通过一种灵活的语法来查找和替换字符串中的文本。正则表达式在编程中用途广泛&#xff0c;不仅限于 JavaScript&#xff0c;在许多编程语言中也都有类似的实现。 …

Vue 绑定style和class

在应用界面中&#xff0c;某些元素的样式是动态的。class 与 style 绑定就是专门用来实现动态样式效果的技术。 如果需要动态绑定 class 或 style 样式&#xff0c;可以使用 v-bind 绑定。 绑定 class 样式【字符串写法】 适用于&#xff1a;类名不确定&#xff0c;需要动态指…

ETL数据转换方式有哪些

ETL数据转换方式有哪些 ETL&#xff08;Extract&#xff0c; Transform&#xff0c; Load&#xff09;是一种常用的数据处理方式&#xff0c;用于从源系统中提取数据&#xff0c;进行转换&#xff0c;并加载到目标系统中。 数据清洗&#xff08;Data Cleaning&#xff09;&am…

快手商品详情数据接口,快手商品详情API接口,快手API接口

在网页抓取方面&#xff0c;可以使用 Python、Java 等编程语言编写程序&#xff0c;通过模拟 HTTP 请求&#xff0c;获取快手网站上的商品页面。在数据提取方面&#xff0c;可以使用正则表达式、XPath 等方式从 HTML 代码中提取出有用的信息。值得注意的是&#xff0c;快手网站…

android studio 移植工程

第一步&#xff1a; 第二步&#xff1a;创建 第三步&#xff1a; 第四步&#xff1a;复制文件至替代新工程中的文件 第五步&#xff1a;修改 第六步&#xff1a;编译OK

设计模式 - 行为型模式考点篇:迭代器模式(概述 | 案例实现 | 优缺点 | 使用场景)

目录 一、行为型模式 一句话概括行为型模式 1.1、迭代器模式 1.1.1、概述 1.1.2、案例实现 1.1.3、优缺点 1.1.4、使用场景 一、行为型模式 一句话概括行为型模式 行为型模式&#xff1a;类或对象间如何交互、如何划分职责&#xff0c;从而更好的完成任务. 1.1、迭代器…

基于局部结构特征的图像匹配

目录 第一章 绪论........................................................................ 6 1.1 研究课题背景....................................................... 6 1.2 图像匹配技术国内外发展现状........................... 8 1.3 课题研究的目的......…

芯片学习记录SN74HC14DR

SN74HC14DR 芯片介绍 该设备包含六个独立的逆变器使用施密特触发器输入。每个门执行正逻辑中的布尔函数Y/A("/"表示“非”)。 引脚信息 引脚名称I/O电平功能11AI0~vcc输入21YO0~vcc输出7GND-电源14VCC-3.3v电源&#xff08;2~6V&#xff09;Y/A 推荐使用条件 参数…

微信浏览器大字体模式 按钮文字居中用line-height 显示异常

按钮文字居中用line-height 的css 在微信浏览器大字体模式&#xff0c;会导致显示错误。改成flex 居中就好了

Joe主题魔改:正文内容实现图片懒加载

引言 有个哥们问我Joe主题的正文部分&#xff0c;如何同样图片懒加载&#xff0c;于是便研究了一下。 探索过程 因为PHP语言我用的很少&#xff0c;并不擅长&#xff0c;于是我去网上搜了一下。 方案一&#xff1a;用一个叫Jquery Lazyload的JavaScript脚本&#xff0c;我尝…

Unity基础课程之物理引擎5-射线的使用方法总结

在实际游戏开发时&#xff0c;不可避免地要用到各种射线检测。即便是一个不怎么用到物理系统的游戏&#xff0c;也很可能要用到射线检测机制。换句话说&#xff0c;射线检测在现代游戏开发中应用得非常广泛&#xff0c;超越了物理游戏的范围。下面简单举几个例子。 &#xff0…

CSS网页标题图案和LOGO SEO优化

favicon图标 将网页的头名字旁边放入一个图案 想将想要的图案切成png图片 然后把png图片转换成ico图案可以借助进行访问 将语法引用到head里面 SEO译为搜索引擎优化。是一种利用搜索引擎的规则提高网站有关搜索引擎的自然排名的方式 SEO的目的是对网站进行深度的优化&…

Unity关键词语音识别

一、背景 最近使用unity开发语音交互内容的时候&#xff0c;遇到了这样的需求&#xff0c;就是需要使用语音关键字来唤醒应用程序&#xff0c;然后再和程序做交互&#xff0c;有点像智能音箱的意思。具体的技术方案方面&#xff0c;也找了一些第三方的服务&#xff0c;比如百度…

【Mybatis】基于Mybatis插件+注解,实现敏感数据自动加解密

一、介绍 业务场景中经常会遇到诸如用户手机号&#xff0c;身份证号&#xff0c;银行卡号&#xff0c;邮箱&#xff0c;地址&#xff0c;密码等等信息&#xff0c;属于敏感信息&#xff0c;需要保存在数据库中。而很多公司会会要求对数据库中的此类数据进行加密存储。 敏感数据…

C语言达到什么水平才能从事单片机工作

C语言达到什么水平才能从事单片机工作 从事单片机工作需要具备一定的C语言编程水平。以下是几个关键要点&#xff1a;基本C语言知识&#xff1a; 掌握C语言的基本语法、数据类型、运算符、流控制语句和函数等基本概念。最近很多小伙伴找我&#xff0c;说想要一些C语言学习资料&…

下载Python的不同版本在同一台电脑上如何共存

1. 下载安装不同版本的Python 官网下载&#xff1a;https://www.python.org/downloads/安装自己需要的版本&#xff08;我这里以Python3.6和Python3.9为例&#xff0c;下载安装细节不过多赘述&#xff09; &#xff08;这里的安装路径自己设定&#xff0c;命名最好是根据下载…

win10取消ie浏览器自动跳转edge浏览器

建议大家看完整篇文章再作操作 随着windows10 日渐更新&#xff0c;各种不同的操作&#xff0c;规避IE浏览器跳转Edge浏览器的问题 算了&#xff0c;找了台云机装的server 有自带的IE 1.&#xff08;失败&#xff09;思路 协助Edge浏览器 管理员身份打开 PowerShell 一般e…

Arcgis实现Tiff合并

Arcgis实现Tiff合并 现有四幅Tiff影像 打开数据管理工具 输入使用这四幅影像 下面这个就是建立数据库&#xff0c;这个不对 点击确定 合成完毕

网络安全就业形势怎么样?

泻药&#xff0c;以下都是我本人的肺腑之言&#xff0c;是答主深耕职场多年&#xff0c;转战数家公司总结周围朋友的从业经验才总结出来的行业真相&#xff0c;真心希望帮助到还没有步入职场的大家&#xff0c;尤其是24届的应届毕业生&#xff0c;多掌握些就业信息就能少走一些…