.net 6 中,使用system.drawing操作图片,生成kb88凯时官网登录的解决方案或打包的时候,会有警告,意思是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 taskwatermark(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 { ////// 文件名 /// public string id { get; set; } ////// 文件大小 /// public string size { get; set; } ////// 文件路径 /// public string url { get; set; } ////// 文件格式 /// public string format { get; set; } ////// 上传状态 /// public bool state { get; set; } ////// 上传消息 /// public string msg { get; set; } ////// 图片宽 /// public int width { get; set; } ////// 图片高 /// public int height { get; set; } }