加入收藏 | 设为首页 | 会员中心 | 我要投稿 汽车网 (https://www.0577qiche.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 编程要点 > 资讯 > 正文

.NET6中如何使用ImageSharp给图片添加水印?

发布时间:2024-01-04 16:47:26 所属栏目:资讯 来源:互联网
导读:  很多朋友都对“.NET6中如何使用ImageSharp给图片添加水印?”的内容比较感兴趣,对此小编整理了相关的知识分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获,那么感兴趣的朋友就继续往下看吧

  很多朋友都对“.NET6中如何使用ImageSharp给图片添加水印?”的内容比较感兴趣,对此小编整理了相关的知识分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获,那么感兴趣的朋友就继续往下看吧!

  .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 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

  {

  ///

 

  /// 文件名

  ///

 

  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; }

  }

  这篇关于“.NET6中如何使用ImageSharp给图片添加水印?”的文章就介绍到这了,更多相关的内容,欢迎关注群英网络,小编将为大家输出更多高质量的实用文章!

(编辑:汽车网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章