.NET 6使用ImageSharp给图片添加水印

  • .NET 6使用ImageSharp给图片添加水印已关闭评论
  • 134 次浏览
  • A+
所属分类:.NET技术
摘要


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


.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:wwwwwwrootupload5176caebc1404caa8b0b350181ae28ab.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; }     } 

如有不正确的地方,还望不吝指教。