在ASP.NET Core中給上傳圖片功能添加水印

在傳統的.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來上傳文件,這包含了不少格式,那咱們試一下吧。async

首先咱們必定要知道,咱們要把圖片保存到什麼地方,咱們在.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多個。也就是畫畫~this

 其中的完整代碼以下:spa

        [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進行測試。日誌

Key要是你參數的名稱,而後圖片最後就成了這個樣子。code

 

相關文章
相關標籤/搜索