欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

在ASP.NET Core中给上传图片功能添加水印

程序员文章站 2022-08-31 16:50:42
在传统的.NET框架中,我们给图片添加水印有的是通过HttpModules或者是HttpHandler,然后可以通过以下代码添加水印: 但是在.NET Core中不允许你这么干了,因为没有WebImage这个类型了。在现在的.NET Core中我们都是通过IFormFile来上传文件,这包含了很多格 ......

在传统的.net框架中,我们给图片添加水印有的是通过httpmodules或者是httphandler,然后可以通过以下代码添加水印:

var image = new webimage(imagebytes);
image.addtextwatermark(
    settings.instance.watermarktext, "white", settings.instance.watermarkfontsize,
    opacity: settings.instance.watermarktextopacitypercentage
);

但是在.net core中不允许你这么干了,因为没有webimage这个类型了。在现在的.net core中我们都是通过iformfile来上传文件,这包含了很多格式,那我们试一下吧。

首先我们一定要知道,我们要把图片保存到什么地方,我们在.net core中获取项目目录需要最基本的构造函数,如以下定义:

public readonly ilogger<imagecontroller> logger = null;
        private ihostingenvironment hostingenv;
        public imagecontroller(ilogger<imagecontroller> logger,ihostingenvironment env)
        {
            logger = logger;
            this.hostingenv = env;
        }

由于可以扩展使用下简单的日志框架,我们也可以把微软那套的日志框架给构造进来。.net core添加水印的代码可以这么写。

// add watermark
                            var watermarkedstream = new memorystream();
                            using (var img = image.fromstream(stream))
                            {
                                using (var graphic = graphics.fromimage(img))
                                {
                                    var font = new font(fontfamily.genericsansserif, 20, fontstyle.bold, graphicsunit.pixel);
                                    var color = color.fromargb(128, 255, 255, 255);
                                    var brush = new solidbrush(color);
                                    var point = new point(img.width - 120, img.height - 30);

                                    graphic.drawstring("cnblogs.com/zaranet", font, brush, point);
                                    img.save(watermarkedstream, imageformat.png);
                                }
                                img.save(hostingenv.webrootpath+"/"+name);
                            }

这里把传过来的内存流变成了image也就是bitmap,然后我们通过了graphic类的方法,变成了可修改的graphic类型,其中的方法大概有200多个。也就是画画~

 其中的完整代码如下:

        [httppost]
        public async task<iactionresult> uploadimageasync(iformfile file)
        {
            try
            {
                if (null == file)
                {
                    logger.logerror("file is null.");
                    return badrequest();
                }

                if (file.length > 0)
                {
                    var name = path.getfilename(file.filename);
                    if (name != null)
                    {
                        using (var stream = new memorystream())
                        {
                            await file.copytoasync(stream);

                            // add watermark
                            var watermarkedstream = new memorystream();
                            using (var img = image.fromstream(stream))
                            {
                                using (var graphic = graphics.fromimage(img))
                                {
                                    var font = new font(fontfamily.genericsansserif, 20, fontstyle.bold, graphicsunit.pixel);
                                    var color = color.fromargb(128, 255, 255, 255);
                                    var brush = new solidbrush(color);
                                    var point = new point(img.width - 120, img.height - 30);

                                    graphic.drawstring("cnblogs.com/zaranet", font, brush, point);
                                    img.save(watermarkedstream, imageformat.png);
                                }
                                img.save(hostingenv.webrootpath+"/"+name);

                            }
                            return statuscode(statuscodes.status200ok);
                        }
                    }
                }
                return badrequest();
            }
            catch (exception e)
            {
                logger.logerror(e, $"error uploading image.");
                return statuscode(statuscodes.status500internalservererror);
            }
        }

最后,你可以使用postman进行测试。

在ASP.NET Core中给上传图片功能添加水印

key要是你参数的名称,然后图片最后就成了这个样子。

 在ASP.NET Core中给上传图片功能添加水印