.net6使用imagesharp实现给图片添加水印-kb88凯时官网登录

来自:网络
时间:2024-06-10
阅读:

.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 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; }
    }
返回顶部
顶部
网站地图