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.mzph.cn/news/105104.shtml

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

相关文章

启航kp OpenHarmony环境搭建

前提 启航kp OpenHarmony环境搭建 搭建好OpenHarmony环境 未搭建好可以参考OpenHarmony docker环境搭建 安装vscode 下载好启航kp所需的开发包和样例 下载地址 搭建过程 进入正确文件夹 首先要进入 /home/openharmony 目录下&#xff0c;如果没有打开在vsc左上角找到文…

JUC并发编程——JUC并发编程概述及Lock锁(重点)(基于狂神说的学习笔记)

基于bilibili狂神说JUC并发编程视频所做笔记 概述 什么是JUC JUC时java.util工具包中的三个包的简称 java.util.concurrent java.util.concurrent.atomic java.util.concurrent.locks 业务&#xff1a;普通的线程代码中&#xff0c;我们常使用Runnable接口 但Runnable没有返…

百度开放平台第三方代小程序开发,授权事件、消息与事件通知总结

大家好&#xff0c;我是小悟 关于百度开放平台第三方代小程序开发的两个事件接收推送通知&#xff0c;是开放平台代小程序实现业务的重要功能。 授权事件推送和消息与事件推送类型都以event的值判断。 授权事件推送通知 授权事件推送包括&#xff1a;推送票据、授权成功、取…

【使用教程】在Ubuntu下PMM60系列一体化伺服电机通过SDO跑循环同步位置模式详解

本教程将指导您在Ubuntu操作系统下使用SDO&#xff08;Service Data Object&#xff09;来配置和控制PMM60系列一体化伺服电机以实现循环同步位置模式。我们将介绍必要的步骤和命令&#xff0c;以确保您能够成功地配置和控制PMM系列一体化伺服电机。 01.准备工作 在正式介绍之…

一种更具破坏力的DDoS放大攻击新模式

近日&#xff0c;内容分发网络&#xff08;CDN&#xff09;运营商Akamai表示&#xff0c;一种使网站快速瘫痪的DDoS放大攻击新方法正在被不法分子所利用。这种方法是通过控制数量巨大的中间设备&#xff08;middlebox&#xff0c;主要是指配置不当的服务器&#xff09;&#xf…

【VR】【Unity】白马VR课堂系列-VR开发核心基础03-项目准备-VR项目设置

【内容】 详细说明 在设置Camera Rig前,我们需要针对VR游戏做一些特别的Project设置。 点击Edit菜单,Project Settings,选中最下方的XR Plugin Management,在右边面板点击Install。 安装完成后,我们需要选中相应安卓平台下的Pico VR套件,关于怎么安装PICO VR插件,请参…

PyCharm运行Nosetests并导出测试报告

1. Pycharm运行Nosetests PyCharm可以使用两种方法&#xff0c;运行Nosetests测试文件&#xff1a; 1) 图形用户界面GUI a) 在PyCharm中&#xff0c;选中测试文件&#xff0c;如Tests/test_demo.py b) 鼠标右键选择Run Nosetests in test_demo.py即可执行测试 注1&#xff…

极简c++(4)类的静态成员

静态数据成员 ::是作用域操作符&#xff01; #include<iostream> using namespace std;class Point{private:int x,y;public:point(int x 0,int y 0):x(x),y(y){}~point();int getX(){return x;}int getY(){return x;} }假设需要统计点的个数&#xff0c;考虑添加一个…

【mfc/VS2022】计图实验:绘图工具设计知识笔记

绘制曲线&#xff08;贝塞尔曲线&#xff09;&#xff1a; 转自&#xff1a;CDC 类 | Microsoft Learn 绘制一条或多条贝塞尔曲线。 BOOL PolyBezier(const POINT* lpPoints,int nCount);参数 lpPoints 指向包含曲线端点和控制点的 POINT 数据结构数组。 nCount 指定 lpPo…

使用kaliber与imu_utils进行IMU、相机+IMU联合标定

目录 1 标定工具编译 1.1 IMU标定工具 imu_utils 1.2 相机标定工具 kaliber 2 标定数据录制 3 开始标定 3.1 IMU标定 3.2 相机标定 3.3 相机IMU联合标定 4 将参数填入ORBSLAM的文件中 1 标定工具编译 1.1 IMU标定工具 imu_utils 标定IMU我们使用imu_utils软件进行标定…

如何使用前端包管理器(如npm、Yarn)?

聚沙成塔每天进步一点点 ⭐ 专栏简介 前端入门之旅&#xff1a;探索Web开发的奇妙世界 欢迎来到前端入门之旅&#xff01;感兴趣的可以订阅本专栏哦&#xff01;这个专栏是为那些对Web开发感兴趣、刚刚踏入前端领域的朋友们量身打造的。无论你是完全的新手还是有一些基础的开发…

Linux CentOS8安装gitlab_ce步骤

1 下载安装包 wget --content-disposition https://packages.gitlab.com/gitlab/gitlab-ce/packages/el/8/gitlab-ce-15.0.2-ce.0.el8.x86_64.rpm/download.rpm2 安装gitlab yum install policycoreutils-python-utilsrpm -Uvh gitlab-ce-15.0.2-ce.0.el8.x86_64.rpm3 更新配…

Stm32_标准库_12_串口_发送数据

波特率&#xff1a;约定的传输速率&#xff0c;1000bps,1s发1000位 引脚 结构 数据帧的传输特点 代码&#xff1a; #include "stm32f10x.h" // Device header #include "Delay.h" #include "OLED.h"GPIO_InitTypeDef GPIO_InitStruct; USART…

2023年建筑电工(建筑特殊工种)证考试题库及建筑电工(建筑特殊工种)试题解析

题库来源&#xff1a;安全生产模拟考试一点通公众号小程序 2023年建筑电工(建筑特殊工种)证考试题库及建筑电工(建筑特殊工种)试题解析是安全生产模拟考试一点通结合&#xff08;安监局&#xff09;特种作业人员操作证考试大纲和&#xff08;质检局&#xff09;特种设备作业人…

【算法-动态规划】两个字符串的删除操作-力扣 583

&#x1f49d;&#x1f49d;&#x1f49d;欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:kuan 的首页,持续学…

Idea创建springboot工程的时候,发现pom文件没有带<parent>标签

今天创建springboot工程&#xff0c;加载maven的时候报错&#xff1a; 这个问题以前遇到过&#xff0c;这是因为 mysql-connector-j 没有带版本号的原因&#xff0c;但是springboot的依赖的版本号不是都统一交给spring-boot-starter-parent管理了吗&#xff0c;为什么还会报错&…

Redis 集群 Redis 事务 Redis 流水线 Redis 发布订阅 Redis Lua脚本操作

Redis 集群 & Redis 事务 & Redis 流水线 & Redis 发布订阅 Redis 集群linux安装redis主从配置查看当前实例主从信息 Redis Sentinelsentinel Redis Cluster Redis 事务Redis 流水线Redis 发布订阅Redis Lua脚本操作 Redis 集群 linux安装redis 下载安装包&#…

五子棋(C语言实现)

目录 构思 1、主程序 2、初始化 3、游戏菜单 4、打印棋盘 6、玩家下棋 7、判断输赢 8、功能整合 人机下棋 完整版&#xff1a; game.h game.c text.c 测试功能代码 构思 五子棋不必多介绍了&#xff0c;大家小时候都玩过哈。 我们要通过程序实现这个小游戏&…

C++算法:最短回文串

题目 给定一个字符串 s&#xff0c;你可以通过在字符串前面添加字符将其转换为回文串。找到并返回可以用这种方式转换的最短回文串。 示例 1&#xff1a; 输入&#xff1a;s “aacecaaa” 输出&#xff1a;“aaacecaaa” 示例 2&#xff1a; 输入&#xff1a;s “abcd” 输…

Django框架集成Celery异步-【2】:django集成celery,拿来即用,可用操作django的orm等功能

一、项目结构和依赖 study_celery | --user |-- models.py |--views.py |--urls.py |--celery_task |--__init__.py |--async_task.py |-- celery.py | --check_task.py | --config.py | --scheduler_task.py | --study_celery | --settings.py | --manage.py 依赖&#xff1a…