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


    项目要求:生成电子证书

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

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

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

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

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

    代码实现步骤

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

    TestImageShapForNet6API

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

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

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

    三、创建内容行的model

    1. using SixLabors.Fonts;
    2. namespace TestImageShapForNet6API
    3. {
    4. public class DrawContent
    5. {
    6. public int x { get; set; }
    7. public int y { get; set; }
    8. public Font font { get; set; } = null!;
    9. public string Text { get; set; } = null!;
    10. public Color color { get; set; } = Color.Black;
    11. }
    12. }

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

    1. using Aliyun.OSS;
    2. namespace TestImageShapForNet6API
    3. {
    4. public class OssHandle
    5. {
    6. const string Endpoint = "oss-cn-zhangjiakou.aliyuncs.com";
    7. const string AccessKeyId = "你的keyId";
    8. const string AccessKeySecret = "你的keysecret";
    9. const string BucketName = "你的bucketname";
    10. const string DirName = "自己起的目录名";
    11. const string Url = "你自己的bucket绑定的域名";
    12. public string PutImg2Oss(byte[] image,string objName)
    13. {
    14. var _img = new MemoryStream(image);
    15. var client = new OssClient(Endpoint,AccessKeyId, AccessKeySecret);
    16. try
    17. {
    18. var res = client.PutObject(BucketName, $"{DirName}/{objName}", _img);
    19. Console.WriteLine(res.ToString);
    20. }
    21. catch(Exception ex)
    22. {
    23. Console.WriteLine(ex.Message);
    24. }
    25. return $"{Url}{DirName}/{objName}";
    26. }
    27. }
    28. }

    五、生成二维码

    1. using ZXing.QrCode;
    2. using ZXing;
    3. namespace TestImageShapForNet6API
    4. {
    5. public class QrFile
    6. {
    7. public async Task<string> Output(string text)
    8. {
    9. var basePath = AppContext.BaseDirectory;
    10. var filePath = Path.Combine(basePath, $"images/qr.jpg");
    11. //生成二维码
    12. var writer = new ZXing.ImageSharp.BarcodeWriter
    13. {
    14. Format = BarcodeFormat.QR_CODE,
    15. Options = new QrCodeEncodingOptions
    16. {
    17. Width = 400,
    18. Height = 400,
    19. Margin = 2,
    20. }
    21. };
    22. var image = writer.WriteAsImageSharp(text);
    23. await image.SaveAsync(filePath);
    24. Console.WriteLine("Image success");
    25. return filePath;
    26. }
    27. }
    28. }

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

    1. using SixLabors.Fonts;
    2. using SixLabors.ImageSharp.Drawing.Processing;
    3. using System.Net;
    4. namespace TestImageShapForNet6API
    5. {
    6. public class MergeImg
    7. {
    8. ///
    9. /// 图片上写字
    10. /// https://docs.sixlabors.com/articles/imagesharp.drawing/gettingstarted.html#expanded-example
    11. ///
    12. ///
    13. ///
    14. ///
    15. ///
    16. ///
    17. ///
    18. private Image? drawingTextOnImage(string url, string qrImgPath, List contList)
    19. {
    20. if (string.IsNullOrWhiteSpace(url) || contList is null || contList.Count < 1)
    21. return null;
    22. // 线上地址的图片,通过获取流的方式读取
    23. WebRequest imgRequest = WebRequest.Create(url);
    24. var res = (HttpWebResponse)imgRequest.GetResponse();
    25. // 加载图片
    26. var image = Image.Load(res.GetResponseStream());
    27. // 按行向图片写入文字
    28. foreach (var item in contList)
    29. {
    30. PointF point = new PointF(item.x, item.y);
    31. image.Mutate(x => x.DrawText(item.Text, item.font, item.color, point));
    32. }
    33. // 加载二维码图片
    34. var qrImg = Image.Load(qrImgPath);
    35. // 向图片上添加二维码
    36. image.Mutate(x => x.DrawImage(qrImg, new Point(1650, 3600), 1));
    37. return image;
    38. }
    39. public async Task<string> DrawingTextOnImage()
    40. {
    41. var basePath = AppDomain.CurrentDomain.BaseDirectory;
    42. var url = "http://oss.crabstech.com/code/21122504.jpg";
    43. var qrImgPath = $"{basePath}images/qr.jpg";
    44. var imgPath = $"{basePath}images/temp.jpg";
    45. var contList = new List();
    46. var _first = new DrawContent
    47. {
    48. x = 600,
    49. y = 1600,
    50. Text = "张小斐",
    51. font = SystemFonts.CreateFont("SimHei", 160, FontStyle.Regular),
    52. color = Color.Green
    53. };
    54. contList.Add(_first);
    55. var img = drawingTextOnImage(url, qrImgPath, contList);
    56. var ms = new MemoryStream();
    57. img.SaveAsJpeg(ms);
    58. Console.WriteLine("生成成功");
    59. var _imgMs = ms.ToArray();
    60. var ossHandler = new OssHandle();
    61. var result = await Task.Run(()=>{
    62. return ossHandler.PutImg2Oss(_imgMs, "code-01.jpg");
    63. });
    64. return result;
    65. }
    66. }
    67. }

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

    完整的program.cs

    1. using TestImageShapForNet6API;
    2. var builder = WebApplication.CreateBuilder(args);
    3. var basePath = AppContext.BaseDirectory;
    4. builder.Services.AddControllers();
    5. // Add services to the container.
    6. // Learn more about configuring Swagger/OpenAPI at https://aka.ms/aspnetcore/swashbuckle
    7. builder.Services.AddEndpointsApiExplorer();
    8. builder.Services.AddSwaggerGen();
    9. var app = builder.Build();
    10. app.UseStaticFiles();
    11. // Configure the HTTP request pipeline.
    12. if (app.Environment.IsDevelopment())
    13. {
    14. }
    15. app.UseSwagger();
    16. app.UseSwaggerUI();
    17. app.MapGet("/qrcode", async () => {
    18. var _qr = new QrFile();
    19. return await _qr.Output("http://oss.crabstech.com/han/6d9a492bf72f4dc2bf59154c8c603c85_2.png");
    20. })
    21. .WithName("QrCode");
    22. app.MapGet("/merimg", async () =>
    23. {
    24. var img = new MergeImg();
    25. return await img.DrawingTextOnImage();
    26. })
    27. .WithName("MergeImg");
    28. app.Run();

    本地启动

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

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

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

    八、添加DockerFile

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

    在项目上点右键

     

     此时生成Dockerfile文件

     点击Dockerfile编辑

    1. #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.
    2. FROM mcr.microsoft.com/dotnet/aspnet:6.0 AS base
    3. WORKDIR /app
    4. EXPOSE 80
    5. #设置时间为中国上海
    6. ENV TZ=Asia/Shanghai
    7. ENV DEBIAN_FRONTEND noninteractive
    8. # 设置包源为阿里
    9. RUN sed -i s@/archive.ubuntu.com/@/mirrors.aliyun.com/@g /etc/apt/sources.list \
    10. && apt-get clean
    11. # 安装 tzdata 软件包
    12. RUN apt-get update \
    13. && apt-get install -y tzdata \
    14. && ln -fs /usr/share/zoneinfo/$TZ /etc/localtime \
    15. && rm -rf /var/lib/apt/lists/ \
    16. && dpkg-reconfigure -f noninteractive tzdata
    17. # 安装字体 注意:“/”的问题,windows下对"/"和"\"容忍度比较高,怎么写基本都可以找到路径。但linux下一定要写 "/",否则会找不到文件
    18. COPY ["TestImageShapForNet6API/fonts/ARIAL.TTF","/usr/share/fonts/ttf-dejavu/ARIAL.TTF"]
    19. COPY ["TestImageShapForNet6API/fonts/SIMFANG.TTF","/usr/share/fonts/ttf-dejavu/SIMFANG.TTF"]
    20. COPY ["TestImageShapForNet6API/fonts/SIMHEI.TTF","/usr/share/fonts/ttf-dejavu/SIMHEI.TTF"]
    21. COPY ["TestImageShapForNet6API/fonts/SIMKAI.TTF","/usr/share/fonts/ttf-dejavu/SIMKAI.TTF"]
    22. COPY ["TestImageShapForNet6API/fonts/SIYUANSONGTI.TTF","/usr/share/fonts/ttf-dejavu/SIYUANSONGTI.TTF"]
    23. FROM mcr.microsoft.com/dotnet/sdk:6.0 AS build
    24. WORKDIR /src
    25. COPY ["TestImageShapForNet6API/TestImageShapForNet6API.csproj", "TestImageShapForNet6API/"]
    26. RUN dotnet restore "TestImageShapForNet6API/TestImageShapForNet6API.csproj"
    27. COPY . .
    28. WORKDIR "/src/TestImageShapForNet6API"
    29. RUN dotnet build "TestImageShapForNet6API.csproj" -c Release -o /app/build
    30. FROM build AS publish
    31. RUN dotnet publish "TestImageShapForNet6API.csproj" -c Release -o /app/publish /p:UseAppHost=false
    32. FROM base AS final
    33. WORKDIR /app
    34. COPY --from=publish /app/publish .
    35. ENTRYPOINT ["dotnet", "TestImageShapForNet6API.dll"]

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

     点击编辑

     

    1. version: '3.4'
    2. services:
    3. testimageshapfornet6api:
    4. image: imagehandle:20231012.01
    5. build:
    6. context: "./TestImageShapForNet6API"
    7. dockerfile: "./TestImageShapForNet6API/Dockerfile"
    8. container_name: "imagehandle"
    9. ports:
    10. - 20205:80
    11. - 20206:443
    12. volumes:
    13. - "./config/appsettings.json:/app/appsettings.json"
    14. environment:
    15. - ASPNETCORE_ENVIRONMENT=Production
    16. restart: always

    这里注意以下三点

     

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

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

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

     

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

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

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

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

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

     

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

    docker-compose -f docker-compose.yml up

    发布成功,是这样的 

     

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

    docker ps

    或者在宝塔的Docker中查看

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

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

    然后修改配置文件

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

    至此项目发布完毕

    如果此时访问域名,显示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

  • 相关阅读:
    Go学习笔记
    vue2知识点————(声明周期,vue动态组件 )
    物联网微消息队列MQTT介绍-EMQX集群搭建以及与SpringBoot整合
    html网页设计大学生作业成品——公益校园网站设计与实现(HTML+CSS+JavaScript)
    【打卡】21天学习挑战赛—RK3399平台开发入门到精通-day8
    Java Spring拦截器优化实践: 专注于API路径拦截
    java8 树类型转换
    基于Centos7.6安裝CDH6集群
    ue5 c++ interface 接口
    epoll使用实例:TCP服务端处理多个客户端请求
  • 原文地址:https://blog.csdn.net/yexuanbaby/article/details/133831495