.NET 6 中,使用System.Drawing操作图片,生成解决方案或打包的时候,会有警告,意思是System.Drawing仅在 'windows' 上受支持。微软官方的解释是:

System.Drawing.Common NuGet 包现在被归为 Windows 特定的库。在为非 Windows 操作系统编译时,平台分析器会在编译时发出警告。

在非 Windows 操作系统上,除非设置了运行时配置开关,否则将引发 TypeInitializationException 异常,其中 PlatformNotSupportedException 作为内部异常

在 .NET 6 之前,使用 System.Drawing.Common 包不会产生任何编译时警告,也不会引发任何运行时异常。

从 .NET 6 开始,当为非 Windows 操作系统编译引用代码时,平台分析器会发出编译时警告。

当然,使用windows操作系统没有任何问题,Linux的话,需要单独的配置。

可以通过在runtimeconfig.json文件中将System.Drawing.EnableUnixSupport 运行时配置开关设置为来启用对 .NET 6 中的非 Windows 平台的支持:true

或者使用第三方库

ImageSharp

SkiaSharp

Microsoft.Maui.Graphics

正如标题,我使用了ImageSharp来操作图片,并给图片添加水印。

//ImageFile为图片物理路径,如下方的注释public async Task<ImageResult> WaterMark(string ImageFile){ImageResult result = new ImageResult();//var ImageFile = "D:\www\wwwroot\upload\5176caebc1404caa8b0b350181ae28ab.jpg";var WaterMark = "D:\\www\\wwwroot\\watermark.png";string FileName = Guid.NewGuid().ToString("N") + ".jpg";string SavePath = "D:\\www\\wwwrootupload\\" + FileName;string imgurl = "/upload/"+FileName;//为了与System.Drawing.Common有所区别,引用使用全路径using (var image = await SixLabors.ImageSharp.Image.LoadAsync(ImageFile)){using (var clone = image.Clone(ctx => ctx.ApplyScalingImageWaterMark("center"))){await clone.SaveAsync(SavePath);}result.width = image.Width;result.height = image.Height;result.url = imgurl;result.format = ".jpg";result.state = true;}return result;}

代码比较简单,首先使用SixLabors.ImageSharp.Image.LoadAsync打开图片,然后使用ImageSharp的自定义扩展方法给图片添加水印。

ApplyScalingImageWaterMark扩展方法:

public static class ImageSharpExtention
{public static IImageProcessingContext ApplyScalingImageWaterMark(this IImageProcessingContext processingContext, string waterPosition = "center",string waterPath){using (var mark_image = SixLabors.ImageSharp.Image.Load(waterPath)){int markWidth = mark_image.Width;int markHeight = mark_image.Height;var imgSize = processingContext.GetCurrentSize();if (markWidth >= imgSize.Width || markHeight >= imgSize.Height) //对水印图片进行缩放{if (imgSize.Width > imgSize.Height)//横的长方形{markWidth = imgSize.Width / 2; //宽缩放一半markHeight = (markWidth * imgSize.Height) / imgSize.Width;}else{markHeight = imgSize.Height / 2;markWidth = (markHeight * imgSize.Width) / imgSize.Height;}mark_image.Mutate(mk => mk.Resize(markWidth, markHeight));}//水印图片完成成立,开始根据位置添加水印var position = waterPosition;if (string.IsNullOrEmpty(position)){position = "center";}position = position.ToLower();if (string.IsNullOrEmpty(position)){position = "center";}SixLabors.ImageSharp.Point point = new SixLabors.ImageSharp.Point();//左上if (position.Contains("lefttop")){point.X = 10;point.Y = 10;}//上中if (position.Contains("topcenter")){point.X = (imgSize.Width - mark_image.Width) / 2;point.Y = 10;}//右上if (position.Contains("righttop")){point.X = (imgSize.Width - mark_image.Width) - 10;point.Y = 10;}//右中if (position.Contains("rightcenter")){point.X = (imgSize.Width - mark_image.Width) - 10;point.Y = (imgSize.Height - mark_image.Height) / 2;}//右下if (position.Contains("rightbottom")){point.X = (imgSize.Width - mark_image.Width) - 10;point.Y = (imgSize.Height - mark_image.Height) - 10;}//下中if (position.Contains("bottomcenter")){point.X = (imgSize.Width - mark_image.Width) / 2;point.Y = (imgSize.Height - mark_image.Height) - 10;}//左下if (position.Contains("leftbottom")){point.X = 10;point.Y = (imgSize.Height - mark_image.Height) - 10;}//左中if (position.Contains("leftcenter")){point.X = 10;point.Y = (imgSize.Height - mark_image.Height) / 2;}if (position.Contains("center")){point.X = (imgSize.Width - mark_image.Width) / 2;point.Y = (imgSize.Height - mark_image.Height) / 2;}float opacity=(float)0.8;//设置不透明度,0-1之间//添加水印return processingContext.DrawImage(mark_image,point,opacity);}}
}

ImageResult类:

public class ImageResult{/// <summary>/// 文件名/// </summary>public string id { get; set; }/// <summary>/// 文件大小/// </summary>public string size { get; set; }/// <summary>/// 文件路径/// </summary>public string url { get; set; }/// <summary>/// 文件格式/// </summary>public string format { get; set; }/// <summary>/// 上传状态/// </summary>public bool state { get; set; }/// <summary>/// 上传消息/// </summary>public string msg { get; set; }/// <summary>/// 图片宽/// </summary>public int width { get; set; }/// <summary>/// 图片高/// </summary>public int height { get; set; }}

.NET 6使用ImageSharp给图片添加水印相关推荐

  1. 分享几个用 Python 给图片添加水印的方法,简单实用

    作者 |俊欣 来源 |关于数据分析与可视化 今天来分享几种可以给图片添加水印的方法,都是十分的简单实用,大家在看了之后也可以私底下去自己试试,有些方法需要的代码量就比较少,有些方法需要的代码量就稍微多 ...

  2. php 怎么支持中文图片显示,给图片添加水印(支持中文)并生成缩略图_php

    // **************************************** // // 功能:给图片添加水印(支持中文)并生成缩略图 // 参数: $srcFile 图片文件名 // $d ...

  3. php绘图技术加水印,PHP图片添加水印功能示例小结

    本文实例总结了PHP图片添加水印功能.分享给大家供大家参考,具体如下: 例1.很简单图下添加水印函数 /** * 追加水印 * * @param string $source_img 原始图片url ...

  4. 【Python】分享几个用Python给图片添加水印的方法,简单实用

    今天来分享几种可以给图片添加水印的方法,都是十分的简单实用,大家在看了之后也可以私底下去自己试试,有些方法需要的代码量就比较少,有些方法需要的代码量就稍微多一些,那我们开始吧 opencv模块 首先我 ...

  5. 批量改名_手把手教你用Python批量给图片添加水印 | 知了干货分享

    我们在网上浏览一些文章的时候,经常会发现文章中会有一些图片,上面会有一些标识,而这些标识就是我们经常说的水印了.很多时候,我们需要给图片加上一些修饰,好让别人能直观的认识到这个图片的出处以及来源,同时 ...

  6. 使用ffmpeg 的 filter 给图片添加水印

    使用ffmpeg 的 filter 给图片添加水印. main.c #include <stdio.h>#include <libavfilter/avfilter.h> #i ...

  7. HttpHandler:给指定路径下的图片添加水印显示

    圣诞节,25日,要交ACCP5.0认证的项目,其中有这样一个要求:书店的所有图书的封面放在了\images\convers\下面,要求所有引用这一路径下的图片都添加书店的店名水印图片.就是说拦截Htt ...

  8. android opencv 水印,关于opencv对图片添加水印

    有一段时间没有写博客了,最近因为自己需要给图片添加水印,就写了个简单的图片添加水印 python:3.6.7 pycharm opencv是一个开源的库,是有c++编写,支持c ++,python,j ...

  9. int.TryParse非预期执行引发的思考 ASP.NET -- WebForm -- 给图片添加水印标记 Windows -- 使用批处理文件.bat删除旧文件...

    int.TryParse非预期执行引发的思考 问题出现 这天在写一个页面,想谨慎些就用了int.TryParse,结果出问题了. 代码如下: Copy int id = 1000; //Request ...

最新文章

  1. 单片微型计算机概念及组成,中国民用航空飞行学院2014年微机原理与接口考研复习大纲...
  2. 今天终于搞懂了:为什么 Java 的 main 方法必须是 public static void?
  3. Ansible5:Ad-hoc常用模块
  4. 结对项目——电梯调度算法的实现和测试
  5. 简单阐述下OC中UIImage三种创建方式~~~
  6. Noip 2014酱油记+简要题解
  7. 做大公司的螺丝钉 vs 当小公司的多面手
  8. Windows Phone 7 Belling‘s课堂(一) 磁贴的学习
  9. 太任性!17 岁少年买不到回国机票,因“泄愤”找黑客攻击系统,被判刑 4 年...
  10. 时间序列分析导论书摘:时间预处理-时序变换
  11. Flink on K8s 在京东的持续优化实践
  12. Atitit View事件分发机制
  13. 【数据技术】利用Python获取高德地图POI数据——以上海瑞幸门店为例
  14. GRE阅读高频机经原文及答案之鸟叫研究
  15. 软考信息系统项目管理师知识点总结2
  16. 2019-07-04:python音频处理库
  17. python创建空字典什么意思_Python3基础 dict 创建字典 空字典
  18. 1024X600RGB屏幕规格书分析
  19. LPC1768-GPIO
  20. 用户输入矩形的长和宽,计算其面积并输出,结果四舍五入,保留2位小数。

热门文章

  1. SANXIN-B01 Verilog教程-郝旭帅团队
  2. 室内外蓝牙定位巡更电子胸牌
  3. Android插件化原理解析
  4. 商品服务3-三级分类-查询展示三级分类数据
  5. RDBMS的范式理论
  6. 2021年下半年系统架构设计师上午真题及答案解析
  7. Qt实战(四)——图片浏览器
  8. RFID标签防伪造方法总结(物理方法)
  9. 全球受攻击的IoT设备呈指数级增长
  10. 软文发布平台上优秀稿件都具有这些特点