.NET Core 保存上傳圖片


.NET Core3.1保存圖片,首先引用System.Drawing.Common

 /// <summary>
        /// 保存圖片
        /// </summary>
        /// <param name="img">圖片文件</param>
        /// <param name="width">指定寬度</param>
        /// <param name="height">指定高度</param>
        /// <param name="mode">縮放類型:HW、W、H、Cut</param>
        /// <param name="msg"></param>
        private static string SaveImage(Image img, int width, int height, string mode, string msg)
        {
            string imgName = string.Empty;
            Image originalImage = img;
            int towidth = width;
            int toheight = height;

            int x = 0;
            int y = 0;
            int ow = originalImage.Width;
            int oh = originalImage.Height;
            switch (mode)
            {
                case "HW"://指定高寬縮放(可能變形)                
                    break;
                case "W"://指定寬,高按比例                    
                    toheight = originalImage.Height * width / originalImage.Width;
                    break;
                case "H"://指定高,寬按比例
                    towidth = originalImage.Width * height / originalImage.Height;
                    break;
                case "Cut"://指定高寬裁減(不變形)                
                    if ((double)originalImage.Width / (double)originalImage.Height > (double)towidth / (double)toheight)
                    {
                        oh = originalImage.Height;
                        ow = originalImage.Height * towidth / toheight;
                        y = 0;
                        x = (originalImage.Width - ow) / 2;
                    }
                    else
                    {
                        ow = originalImage.Width;
                        oh = originalImage.Width * height / towidth;
                        x = 0;
                        y = (originalImage.Height - oh) / 2;
                    }
                    break;
                default:
                    break;
            }

            //新建一個bmp圖片
            Image bitmap = new Bitmap(towidth, toheight);
            using (var g = Graphics.FromImage(bitmap))
            {
                //設置高質量插值法
                g.InterpolationMode = System.Drawing.Drawing2D.InterpolationMode.High;
                //設置高質量,低速度呈現平滑程度
                g.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.HighQuality;
                //清空畫布並以透明背景色填充
                g.Clear(Color.Transparent);
                //在指定位置並且按指定大小繪制原圖片的指定部分
                g.DrawImage(originalImage, new Rectangle(0, 0, towidth, toheight), new Rectangle(x, y, ow, oh), GraphicsUnit.Pixel);
                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(towidth - 100, toheight - 30);
                g.DrawString(msg, font, brush, point);
            }

            try
            {
                string filePath = AppDomain.CurrentDomain.BaseDirectory + "Picture\\";

                string dir = Path.GetDirectoryName(filePath);
                if (!Directory.Exists(dir))
                {
                    Directory.CreateDirectory(dir);
                }
                Random rd = new Random();
                imgName = $"{ToUnixTimestampByMilliseconds(DateTime.Now)}{rd.Next(0,1000000)}.jpg";
                //以jpg格式保存縮略圖
                bitmap.Save($"{filePath}{imgName}", ImageFormat.Jpeg);

                return imgName;
            }
            catch (Exception e)
            {
                throw e;
            }
            finally
            {
                originalImage.Dispose();
                bitmap.Dispose();
            }
        }

 如果報錯:A generic error occurred in GDI+ 需要從以下4個方面進行分析:

1. 相應的帳戶沒有寫權限。
解決方法:賦予 NETWORK SERVICE 帳戶以寫權限,賦予權限方法這里不做表述。
2. 指定的物理路徑不存在。
解決方法:
在調用 Save 方法之前,先判斷目錄是否存在,若不存在,則創建。
if (!Directory.Exists(dirpath))
Directory.CreateDirectory(dirpath);

3.生成的文件名格式有誤:

我這里就是這個錯誤,因為我保存的文件名是獲取的當前時間,生成的格式是yyyy-MM-dd HH:mm:ss,這個格式也導致報這個錯,經過

排查,發現是HH:mm:ss中的:導致的原因,最終將:移除,就能正常保存。

4.文件被鎖定

有個簡單的土方法解決,將bitmap復制一份並且釋放掉之前的bitmap就可以保存了

例如:

Bitmap bmpTemp = new Bitmap(image);
Bitmap bmp = new Bitmap(bmpTemp);
bmpTemp.Dispose();
bmp.Save(image, ImageFormat.Jpeg);


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM