.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);
