搜索

查看: 3042|回复: 11

[ASP.NET] .NET6使用ImageSharp实现给图片添加水印

[复制链接]
发表于 2023-5-4 11:26:09 | 显示全部楼层 |阅读模式
Editor 2023-5-4 11:26:09 3042 11 看全部
.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[I] 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实现给图片添加水印的文章就介绍到这了,更多相关.NET ImageSharp图片添加水印内容请搜索知鸟论坛以前的文章或继续浏览下面的相关文章希望大家以后多多支持知鸟论坛
  • 回复

    使用道具 举报

    发表于 2023-6-28 18:52:34 | 显示全部楼层
    掌舵的鱼1987 2023-6-28 18:52:34 看全部
    这个帖子不回对不起自己!我想我是一天也不能离开知鸟论坛
    回复

    使用道具 举报

    发表于 2023-6-29 20:12:44 | 显示全部楼层
    我的苦恼冉 2023-6-29 20:12:44 看全部
    我看不错噢 谢谢楼主!知鸟论坛越来越好!
    回复

    使用道具 举报

    发表于 2023-6-29 22:22:16 | 显示全部楼层
    十二音阶囤 2023-6-29 22:22:16 看全部
    这个帖子不回对不起自己!我想我是一天也不能离开知鸟论坛
    回复

    使用道具 举报

    发表于 2023-6-30 00:10:58 | 显示全部楼层
    123456823 2023-6-30 00:10:58 看全部
    楼主,我太崇拜你了!我想我是一天也不能离开知鸟论坛
    回复

    使用道具 举报

    发表于 2023-6-30 01:17:13 | 显示全部楼层
    计划你大爷计j 2023-6-30 01:17:13 看全部
    这个帖子不回对不起自己!我想我是一天也不能离开知鸟论坛
    回复

    使用道具 举报

    发表于 2023-6-30 03:58:30 | 显示全部楼层
    永远就三年疗 2023-6-30 03:58:30 看全部
    论坛不能没有像楼主这样的人才啊!我会一直支持知鸟论坛
    回复

    使用道具 举报

    发表于 2023-6-30 09:13:08 | 显示全部楼层
    无人岛屿颈 2023-6-30 09:13:08 看全部
    我看不错噢 谢谢楼主!知鸟论坛越来越好!
    回复

    使用道具 举报

    发表于 2023-6-30 19:54:01 | 显示全部楼层
    音乐之家1 2023-6-30 19:54:01 看全部
    这东西我收了!谢谢楼主!知鸟论坛真好!
    回复

    使用道具 举报

    发表于 2023-6-30 22:04:58 | 显示全部楼层
    落败的青春阳落s 2023-6-30 22:04:58 看全部
    楼主,大恩不言谢了!知鸟论坛是最棒的!
    回复

    使用道具 举报

    • 您可能感兴趣
    点击右侧快捷回复 【请勿灌水】
    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则 返回列表

    RSS订阅| SiteMap| 小黑屋| 知鸟论坛
    联系邮箱E-mail:zniao@foxmail.com
    快速回复 返回顶部 返回列表