浏览代码

图片处理支持png

懒得勤快 3 年之前
父节点
当前提交
9b0cbf231e

+ 1 - 1
Masuit.Tools.Abstractions/Masuit.Tools.Abstractions.csproj

@@ -4,7 +4,7 @@
     <LangVersion>latest</LangVersion>
     <AllowUnsafeBlocks>true</AllowUnsafeBlocks>
     <CodeAnalysisRuleSet />
-    <Version>2.4.7.7</Version>
+    <Version>2.4.7.8</Version>
     <Authors>懒得勤快</Authors>
     <Description>Masuit.Tools基础公共库,包含一些常用的操作类,大都是静态类,加密解密,反射操作,Excel简单导出,权重随机筛选算法,分布式短id,表达式树,linq扩展,文件压缩,多线程下载和FTP客户端,硬件信息,字符串扩展方法,日期时间扩展操作,中国农历,大文件拷贝,图像裁剪,验证码,断点续传,集合扩展等常用封装。</Description>
     <Copyright>懒得勤快,长空X</Copyright>

+ 102 - 98
Masuit.Tools.Abstractions/Media/ImageUtilities.cs

@@ -29,13 +29,14 @@ namespace Masuit.Tools.Media
             //创建目录
             string dir = Path.GetDirectoryName(fileSaveUrl);
             Directory.CreateDirectory(dir);
+
             //原始图片(获取原始图片创建对象,并使用流中嵌入的颜色管理信息)
             var initImage = Image.FromStream(fromFile, true);
 
             //原图宽高均小于模版,不作处理,直接保存
             if ((initImage.Width <= side) && (initImage.Height <= side))
             {
-                initImage.Save(fileSaveUrl, ImageFormat.Jpeg);
+                initImage.Save(fileSaveUrl);
             }
             else
             {
@@ -56,37 +57,47 @@ namespace Masuit.Tools.Media
                         //对象实例化
                         pickedImage = new Bitmap(initHeight, initHeight);
                         pickedG = Graphics.FromImage(pickedImage);
+
                         //设置质量
                         pickedG.InterpolationMode = InterpolationMode.HighQualityBicubic;
                         pickedG.SmoothingMode = SmoothingMode.HighQuality;
+
                         //定位
                         Rectangle fromR = new Rectangle((initWidth - initHeight) / 2, 0, initHeight, initHeight);
                         Rectangle toR = new Rectangle(0, 0, initHeight, initHeight);
+
                         //画图
                         pickedG.DrawImage(initImage, toR, fromR, GraphicsUnit.Pixel);
+
                         //重置宽
                         initWidth = initHeight;
                     }
+
                     //高大于宽的竖图
                     else
                     {
                         //对象实例化
                         pickedImage = new Bitmap(initWidth, initWidth);
                         pickedG = Graphics.FromImage(pickedImage);
+
                         //设置质量
                         pickedG.InterpolationMode = InterpolationMode.HighQualityBicubic;
                         pickedG.SmoothingMode = SmoothingMode.HighQuality;
+
                         //定位
                         Rectangle fromR = new Rectangle(0, (initHeight - initWidth) / 2, initWidth, initWidth);
                         Rectangle toR = new Rectangle(0, 0, initWidth, initWidth);
+
                         //画图
                         pickedG.DrawImage(initImage, toR, fromR, GraphicsUnit.Pixel);
+
                         //重置高
                         initHeight = initWidth;
                     }
 
                     //将截图对象赋给原图
                     initImage = (Image)pickedImage.Clone();
+
                     //释放截图资源
                     initImage.Dispose();
                     pickedG.Dispose();
@@ -96,11 +107,14 @@ namespace Masuit.Tools.Media
                 //缩略图对象
                 using Image resultImage = new Bitmap(side, side);
                 using var resultG = Graphics.FromImage(resultImage);
+
                 //设置质量
                 resultG.InterpolationMode = InterpolationMode.HighQualityBicubic;
                 resultG.SmoothingMode = SmoothingMode.HighQuality;
+
                 //用指定背景色清空画布
                 resultG.Clear(Color.White);
+
                 //绘制缩略图
                 resultG.DrawImage(initImage, new Rectangle(0, 0, side, side), new Rectangle(0, 0, initWidth, initHeight), GraphicsUnit.Pixel);
 
@@ -121,12 +135,13 @@ namespace Masuit.Tools.Media
                         [0] = new EncoderParameter(Encoder.Quality, quality)
                     }
                 };
+
                 //保存缩略图
                 resultImage.Save(fileSaveUrl, ici, ep);
             }
         }
 
-        #endregion
+        #endregion 正方型裁剪并缩放
 
         #region 自定义裁剪并缩放
 
@@ -147,12 +162,13 @@ namespace Masuit.Tools.Media
             //原图宽高均小于模版,不作处理,直接保存
             if ((initImage.Width <= maxWidth) && (initImage.Height <= maxHeight))
             {
-                initImage.Save(fileSaveUrl, ImageFormat.Jpeg);
+                initImage.Save(fileSaveUrl);
             }
             else
             {
                 //模版的宽高比例
                 double templateRate = (double)maxWidth / maxHeight;
+
                 //原图片的宽高比例
                 double initRate = (double)initImage.Width / initImage.Height;
 
@@ -166,8 +182,9 @@ namespace Masuit.Tools.Media
                     templateG.SmoothingMode = SmoothingMode.HighQuality;
                     templateG.Clear(Color.White);
                     templateG.DrawImage(initImage, new Rectangle(0, 0, maxWidth, maxHeight), new Rectangle(0, 0, initImage.Width, initImage.Height), GraphicsUnit.Pixel);
-                    templateImage.Save(fileSaveUrl, ImageFormat.Jpeg);
+                    templateImage.Save(fileSaveUrl, initImage.RawFormat);
                 }
+
                 //原图与模版比例不等,裁剪后缩放
                 else
                 {
@@ -198,6 +215,7 @@ namespace Masuit.Tools.Media
                         toR.Width = initImage.Width;
                         toR.Height = (int)Math.Floor(initImage.Width / templateRate);
                     }
+
                     //高为标准进行裁剪
                     else
                     {
@@ -251,7 +269,7 @@ namespace Masuit.Tools.Media
             }
         }
 
-        #endregion
+        #endregion 自定义裁剪并缩放
 
         #region 等比缩放
 
@@ -269,6 +287,7 @@ namespace Masuit.Tools.Media
             //创建目录
             string dir = Path.GetDirectoryName(savePath);
             Directory.CreateDirectory(dir);
+
             //原始图片(获取原始图片创建对象,并使用流中嵌入的颜色管理信息)
             using Image initImage = Image.FromStream(fromFile, true);
 
@@ -276,7 +295,7 @@ namespace Masuit.Tools.Media
             if ((initImage.Width <= targetWidth) && (initImage.Height <= targetHeight))
             {
                 //文字水印
-                if (watermarkText != "")
+                if (!string.IsNullOrEmpty(watermarkText))
                 {
                     using var gWater = Graphics.FromImage(initImage);
                     Font fontWater = new Font("黑体", 10);
@@ -286,11 +305,12 @@ namespace Masuit.Tools.Media
                 }
 
                 //透明图片水印
-                if (watermarkImage != "")
+                if (!string.IsNullOrEmpty(watermarkImage))
                 {
                     if (File.Exists(watermarkImage))
                     {
                         using var wrImage = Image.FromFile(watermarkImage);
+
                         //水印绘制条件:原始图片宽高均大于或等于水印图片
                         if ((initImage.Width >= wrImage.Width) && (initImage.Height >= wrImage.Height))
                         {
@@ -324,7 +344,7 @@ namespace Masuit.Tools.Media
                 }
 
                 //保存
-                initImage.Save(savePath, ImageFormat.Jpeg);
+                initImage.Save(savePath, initImage.RawFormat);
             }
             else
             {
@@ -343,6 +363,7 @@ namespace Masuit.Tools.Media
                         newHeight = initImage.Height * (targetWidth / initImage.Width);
                     }
                 }
+
                 //高大于宽(竖图)
                 else
                 {
@@ -358,6 +379,7 @@ namespace Masuit.Tools.Media
                 //生成新图
                 //新建一个bmpp图片
                 using Image newImage = new Bitmap((int)newWidth, (int)newHeight);
+
                 //新建一个画板
                 using Graphics newG = Graphics.FromImage(newImage);
 
@@ -367,25 +389,27 @@ namespace Masuit.Tools.Media
 
                 //置背景色
                 newG.Clear(Color.White);
+
                 //画图
                 newG.DrawImage(initImage, new Rectangle(0, 0, newImage.Width, newImage.Height), new Rectangle(0, 0, initImage.Width, initImage.Height), GraphicsUnit.Pixel);
 
                 //文字水印
-                if (watermarkText != "")
+                if (!string.IsNullOrEmpty(watermarkText))
                 {
                     using var gWater = Graphics.FromImage(newImage);
-                    Font fontWater = new Font("宋体", 10);
+                    Font fontWater = new Font("微软雅黑", 10);
                     Brush brushWater = new SolidBrush(Color.White);
                     gWater.DrawString(watermarkText, fontWater, brushWater, 10, 10);
                     gWater.Dispose();
                 }
 
                 //透明图片水印
-                if (watermarkImage != "")
+                if (!string.IsNullOrEmpty(watermarkImage))
                 {
                     if (File.Exists(watermarkImage))
                     {
                         using Image wrImage = Image.FromFile(watermarkImage);
+
                         //水印绘制条件:原始图片宽高均大于或等于水印图片
                         if ((newImage.Width >= wrImage.Width) && (newImage.Height >= wrImage.Height))
                         {
@@ -393,9 +417,11 @@ namespace Masuit.Tools.Media
 
                             //透明属性
                             ImageAttributes imgAttributes = new ImageAttributes();
-                            ColorMap colorMap = new ColorMap();
-                            colorMap.OldColor = Color.FromArgb(255, 0, 255, 0);
-                            colorMap.NewColor = Color.FromArgb(0, 0, 0, 0);
+                            ColorMap colorMap = new ColorMap
+                            {
+                                OldColor = Color.FromArgb(255, 0, 255, 0),
+                                NewColor = Color.FromArgb(0, 0, 0, 0)
+                            };
                             ColorMap[] remapTable = { colorMap };
                             imgAttributes.SetRemapTable(remapTable, ColorAdjustType.Bitmap);
 
@@ -417,11 +443,11 @@ namespace Masuit.Tools.Media
                 }
 
                 //保存缩略图
-                newImage.Save(savePath, ImageFormat.Jpeg);
+                newImage.Save(savePath, initImage.RawFormat);
             }
         }
 
-        #endregion
+        #endregion 等比缩放
 
         #region 判断文件类型是否为WEB格式图片
 
@@ -436,12 +462,12 @@ namespace Masuit.Tools.Media
             return contentType == "image/pjpeg" || contentType == "image/jpeg" || contentType == "image/gif" || contentType == "image/bmpp" || contentType == "image/png";
         }
 
-        #endregion
+        #endregion 判断文件类型是否为WEB格式图片
 
         #region 裁剪图片
 
         /// <summary>
-        /// 裁剪图片 -- 用GDI+   
+        /// 裁剪图片 -- 用GDI+
         /// </summary>
         /// <param name="b">原始Bitmap</param>
         /// <param name="rec">裁剪区域</param>
@@ -478,24 +504,25 @@ namespace Masuit.Tools.Media
             }
         }
 
-        #endregion
+        #endregion 裁剪图片
 
         #region 缩放图片
 
-        /// <summary>  
-        ///  Resize图片   
-        /// </summary>  
-        /// <param name="bmpp">原始Bitmap </param>  
-        /// <param name="newWidth">新的宽度</param>  
-        /// <param name="newHeight">新的高度</param>  
-        /// <returns>处理以后的图片</returns>  
+        /// <summary>
+        ///  Resize图片
+        /// </summary>
+        /// <param name="bmpp">原始Bitmap </param>
+        /// <param name="newWidth">新的宽度</param>
+        /// <param name="newHeight">新的高度</param>
+        /// <returns>处理以后的图片</returns>
         public static Bitmap ResizeImage(this Bitmap bmpp, int newWidth, int newHeight)
         {
             try
             {
                 var b = new Bitmap(newWidth, newHeight);
                 using var g = Graphics.FromImage(b);
-                // 插值算法的质量   
+
+                // 插值算法的质量
                 g.InterpolationMode = InterpolationMode.HighQualityBicubic;
                 g.DrawImage(bmpp, new Rectangle(0, 0, newWidth, newHeight), new Rectangle(0, 0, bmpp.Width, bmpp.Height), GraphicsUnit.Pixel);
                 return b;
@@ -506,7 +533,7 @@ namespace Masuit.Tools.Media
             }
         }
 
-        #endregion
+        #endregion 缩放图片
 
         #region 裁剪并缩放
 
@@ -515,12 +542,12 @@ namespace Masuit.Tools.Media
         /// </summary>
         /// <param name="bmpp">原始图片</param>
         /// <param name="rec">裁剪的矩形区域</param>
-        /// <param name="newWidth">新的宽度</param>  
-        /// <param name="newHeight">新的高度</param>  
+        /// <param name="newWidth">新的宽度</param>
+        /// <param name="newHeight">新的高度</param>
         /// <returns>处理以后的图片</returns>
         public static Bitmap CutAndResize(this Bitmap bmpp, Rectangle rec, int newWidth, int newHeight) => bmpp.CutImage(rec).ResizeImage(newWidth, newHeight);
 
-        #endregion
+        #endregion 裁剪并缩放
 
         #region 无损压缩图片
 
@@ -544,10 +571,10 @@ namespace Masuit.Tools.Media
             }
 
             using Image iSource = Image.FromFile(sFile);
-            ImageFormat tFormat = iSource.RawFormat;
             int dHeight = iSource.Height;
             int dWidth = iSource.Width;
             int sW, sH;
+
             //按比例缩放
             Size temSize = new Size(iSource.Width, iSource.Height);
             if (temSize.Width > dHeight || temSize.Width > dWidth)
@@ -597,7 +624,7 @@ namespace Masuit.Tools.Media
                 }
                 else
                 {
-                    bmpp.Save(dFile, tFormat);
+                    bmpp.Save(dFile, iSource.RawFormat);
                 }
                 return true;
             }
@@ -626,10 +653,10 @@ namespace Masuit.Tools.Media
             }
 
             using Image iSource = Image.FromStream(src);
-            ImageFormat tFormat = iSource.RawFormat;
             int dHeight = iSource.Height;
             int dWidth = iSource.Width;
             int sW, sH;
+
             //按比例缩放
             Size temSize = new Size(iSource.Width, iSource.Height);
             if (temSize.Width > dHeight || temSize.Width > dWidth)
@@ -678,7 +705,7 @@ namespace Masuit.Tools.Media
                 }
                 else
                 {
-                    bmpp.Save(dest, tFormat);
+                    bmpp.Save(dest, iSource.RawFormat);
                 }
                 return true;
             }
@@ -688,7 +715,7 @@ namespace Masuit.Tools.Media
             }
         }
 
-        #endregion
+        #endregion 无损压缩图片
 
         #region 缩略图
 
@@ -699,8 +726,21 @@ namespace Masuit.Tools.Media
         /// <param name="thumbnailPath">缩略图路径(物理路径)</param>
         /// <param name="width">缩略图宽度</param>
         /// <param name="height">缩略图高度</param>
-        /// <param name="mode">生成缩略图的方式</param>    
+        /// <param name="mode">生成缩略图的方式</param>
         public static void MakeThumbnail(this Image originalImage, string thumbnailPath, int width, int height, ThumbnailCutMode mode)
+        {
+            using var bitmap = MakeThumbnail(originalImage, width, height, mode);
+            bitmap.Save(thumbnailPath, originalImage.RawFormat);
+        }
+
+        /// <summary>
+        /// 生成缩略图
+        /// </summary>
+        /// <param name="originalImage">原图</param>
+        /// <param name="width">缩略图宽度</param>
+        /// <param name="height">缩略图高度</param>
+        /// <param name="mode">生成缩略图的方式</param>
+        public static Image MakeThumbnail(this Image originalImage, int width, int height, ThumbnailCutMode mode)
         {
             int towidth = width;
             int toheight = height;
@@ -711,15 +751,18 @@ namespace Masuit.Tools.Media
 
             switch (mode)
             {
-                case ThumbnailCutMode.Fixed: //指定高宽缩放(可能变形)                
+                case ThumbnailCutMode.Fixed: //指定高宽缩放(可能变形)
                     break;
-                case ThumbnailCutMode.LockWidth: //指定宽,高按比例                    
+
+                case ThumbnailCutMode.LockWidth: //指定宽,高按比例
                     toheight = originalImage.Height * width / originalImage.Width;
                     break;
+
                 case ThumbnailCutMode.LockHeight: //指定高,宽按比例
                     towidth = originalImage.Width * height / originalImage.Height;
                     break;
-                case ThumbnailCutMode.Cut: //指定高宽裁减(不变形)                
+
+                case ThumbnailCutMode.Cut: //指定高宽裁减(不变形)
                     if (originalImage.Width / (double)originalImage.Height > towidth / (double)toheight)
                     {
                         oh = originalImage.Height;
@@ -738,7 +781,7 @@ namespace Masuit.Tools.Media
             }
 
             //新建一个bmpp图片
-            using Image bitmap = new Bitmap(towidth, toheight);
+            Image bitmap = new Bitmap(towidth, toheight);
 
             //新建一个画板
             using Graphics g = Graphics.FromImage(bitmap);
@@ -758,11 +801,10 @@ namespace Masuit.Tools.Media
             //三:画那块区域。
             g.DrawImage(originalImage, new Rectangle(0, 0, towidth, toheight), new Rectangle(x, y, ow, oh), GraphicsUnit.Pixel);
 
-            //以jpg格式保存缩略图
-            bitmap.Save(thumbnailPath, ImageFormat.Jpeg);
+            return bitmap;
         }
 
-        #endregion
+        #endregion 缩略图
 
         #region 调整光暗
 
@@ -791,7 +833,7 @@ namespace Masuit.Tools.Media
             return bmp;
         }
 
-        #endregion
+        #endregion 调整光暗
 
         #region 反色处理
 
@@ -819,7 +861,7 @@ namespace Masuit.Tools.Media
             return bmp;
         }
 
-        #endregion
+        #endregion 反色处理
 
         #region 浮雕处理
 
@@ -854,7 +896,7 @@ namespace Masuit.Tools.Media
             return newBitmap;
         }
 
-        #endregion
+        #endregion 浮雕处理
 
         #region 拉伸图片
 
@@ -883,7 +925,7 @@ namespace Masuit.Tools.Media
             }
         }
 
-        #endregion
+        #endregion 拉伸图片
 
         #region 滤色处理
 
@@ -909,7 +951,7 @@ namespace Masuit.Tools.Media
             return bmp;
         }
 
-        #endregion
+        #endregion 滤色处理
 
         #region 左右翻转
 
@@ -922,6 +964,7 @@ namespace Masuit.Tools.Media
         public static Bitmap RevPicLR(this Bitmap source, int width, int height)
         {
             var bmp = new Bitmap(width, height);
+
             //x,y是循环次数,z是用来记录像素点的x坐标的变化的
             for (var y = height - 1; y >= 0; y--)
             {
@@ -937,7 +980,7 @@ namespace Masuit.Tools.Media
             return bmp;
         }
 
-        #endregion
+        #endregion 左右翻转
 
         #region 上下翻转
 
@@ -964,51 +1007,12 @@ namespace Masuit.Tools.Media
             return bmp;
         }
 
-        #endregion
-
-        #region 压缩图片
-
-        /// <summary>
-        /// 压缩到指定尺寸
-        /// </summary>
-        /// <param name="img"></param>
-        /// <param name="newfile">新文件</param>
-        public static bool Compress(this Image img, string newfile)
-        {
-            try
-            {
-                Size newSize = new Size(100, 125);
-                using Bitmap outBmp = new Bitmap(newSize.Width, newSize.Height);
-                using Graphics g = Graphics.FromImage(outBmp);
-                g.CompositingQuality = CompositingQuality.HighQuality;
-                g.SmoothingMode = SmoothingMode.HighQuality;
-                g.InterpolationMode = InterpolationMode.HighQualityBicubic;
-                g.DrawImage(img, new Rectangle(0, 0, newSize.Width, newSize.Height), 0, 0, img.Width, img.Height, GraphicsUnit.Pixel);
-                var encoderParams = new EncoderParameters();
-                var quality = new long[1];
-                quality[0] = 100;
-                encoderParams.Param[0] = new EncoderParameter(Encoder.Quality, quality);
-                ImageCodecInfo[] arrayICI = ImageCodecInfo.GetImageEncoders();
-                ImageCodecInfo jpegICI = arrayICI.FirstOrDefault(t => t.FormatDescription.Equals("JPEG"));
-                if (jpegICI != null)
-                {
-                    outBmp.Save(newfile, ImageFormat.Jpeg);
-                }
-
-                return true;
-            }
-            catch (Exception)
-            {
-                return false;
-            }
-        }
-
-        #endregion
+        #endregion 上下翻转
 
-        #region 图片灰度化
+        #region 灰度化
 
         /// <summary>
-        /// 图片灰度化
+        /// 色彩灰度化
         /// </summary>
         /// <param name="c">输入颜色</param>
         /// <returns>输出颜色</returns>
@@ -1018,7 +1022,7 @@ namespace Masuit.Tools.Media
             return Color.FromArgb(rgb, rgb, rgb);
         }
 
-        #endregion
+        #endregion 灰度化
 
         #region 转换为黑白图片
 
@@ -1044,12 +1048,12 @@ namespace Masuit.Tools.Media
             return bmp;
         }
 
-        #endregion
+        #endregion 转换为黑白图片
 
         #region 获取图片中的各帧
 
         /// <summary>
-        /// 获取图片中的各帧
+        /// 获取gif图片中的各帧
         /// </summary>
         /// <param name="gif">源gif</param>
         /// <param name="pSavedPath">保存路径</param>
@@ -1064,8 +1068,7 @@ namespace Masuit.Tools.Media
             }
         }
 
-        #endregion
-
+        #endregion 获取图片中的各帧
 
         /// <summary>
         /// 将dataUri保存为图片
@@ -1079,6 +1082,7 @@ namespace Masuit.Tools.Media
             byte[] arr = Convert.FromBase64String(strbase64);
             using var ms = new MemoryStream(arr);
             using var bmpp = new Bitmap(ms);
+
             //新建第二个bitmap类型的bmpp2变量。
             var bmpp2 = new Bitmap(bmpp, bmpp.Width, bmpp.Height);
             using var draw = Graphics.FromImage(bmpp2);
@@ -1086,4 +1090,4 @@ namespace Masuit.Tools.Media
             return bmpp2;
         }
     }
-}
+}

+ 1 - 1
Masuit.Tools.Core/Masuit.Tools.Core.csproj

@@ -18,7 +18,7 @@ github:https://github.com/ldqk/Masuit.Tools
         <UserSecretsId>830c282f-f7c1-42be-8651-4cd06ac8e73f</UserSecretsId>
         <RepositoryType>Github</RepositoryType>
         <GeneratePackageOnBuild>True</GeneratePackageOnBuild>
-        <Version>2.4.7.7</Version>
+        <Version>2.4.7.8</Version>
         <FileVersion>2.4.5.6</FileVersion>
         <Company>masuit.com</Company>
         <AssemblyVersion>2.4.5.6</AssemblyVersion>

+ 1 - 1
Masuit.Tools.Net45/package.nuspec

@@ -4,7 +4,7 @@
     <!--*-->
     <id>Masuit.Tools.Net45</id>
     <!--*-->
-    <version>2.4.7.7</version>
+    <version>2.4.7.8</version>
     <title>Masuit.Tools</title>
     <!--*-->
     <authors>懒得勤快</authors>

+ 1 - 1
Masuit.Tools/package.nuspec

@@ -4,7 +4,7 @@
     <!--*-->
     <id>Masuit.Tools.Net</id>
     <!--*-->
-    <version>2.4.7.7</version>
+    <version>2.4.7.8</version>
     <title>Masuit.Tools</title>
     <!--*-->
     <authors>懒得勤快</authors>

+ 100 - 108
NetCoreTest/Program.cs

@@ -15,130 +15,122 @@ using System.ComponentModel;
 using System.IO;
 using System.Linq;
 using Masuit.Tools.Systems;
+using NetCoreTest;
 using LicenseContext = OfficeOpenXml.LicenseContext;
 
-namespace NetCoreTest
+ExcelPackage.LicenseContext = LicenseContext.NonCommercial;
+var pkg = new ExcelPackage();
+pkg.Workbook.Worksheets.Add("Sheet1");
+var sheet = pkg.Workbook.Worksheets["Sheet1"];
+sheet.FillWorksheet(Enumerable.Range(1, 2).Select(i => new
 {
-    public class Program
+    序号 = i,
+    图片 = new Dictionary<string, Stream>()
     {
-        public static void Main(string[] args)
-        {
-            ExcelPackage.LicenseContext = LicenseContext.NonCommercial;
-            var pkg = new ExcelPackage();
-            pkg.Workbook.Worksheets.Add("Sheet1");
-            var sheet = pkg.Workbook.Worksheets["Sheet1"];
-            sheet.FillWorksheet(Enumerable.Range(1, 2).Select(i => new
-            {
-                序号 = i,
-                图片 = new Dictionary<string, Stream>()
-                {
-                    ["https://ldqk.org/1383"] = File.OpenRead(@"D:\images\emotion\16.jpg"),
-                    ["https://ldqk.org/1384"] = File.OpenRead(@"D:\images\emotion\16.jpg"),
-                    ["https://ldqk.org/1385"] = File.OpenRead(@"D:\images\emotion\16.jpg"),
-                }
-            }).ToDataTable("aa"), null, 4, 3);
-            sheet.Cells["A1:F1"].Merge = true;
-            sheet.Cells["A1"].Value = "title";
-            pkg.SaveAs("Y:\\1.xlsx");
-            Console.WriteLine("ok");
+        ["https://ldqk.org/1383"] = File.OpenRead(@"D:\images\emotion\16.jpg"),
+        ["https://ldqk.org/1384"] = File.OpenRead(@"D:\images\emotion\16.jpg"),
+        ["https://ldqk.org/1385"] = File.OpenRead(@"D:\images\emotion\16.jpg"),
+    }
+}).ToDataTable("aa"), null, 4, 3);
+sheet.Cells["A1:F1"].Merge = true;
+sheet.Cells["A1"].Value = "title";
+pkg.SaveAs("Y:\\1.xlsx");
+Console.WriteLine("ok");
 
-            Console.ReadKey();
-            Enumerable.Range(1, 2).Select(i => new
-            {
-                序号 = i,
-                图片 = new Dictionary<string, FileStream>()
-                {
-                    ["https://ldqk.org/1383"] = File.OpenRead(@"D:\images\emotion\16.jpg")
-                }
-            }).ToDataTable("aa").ToExcel().SaveFile(@"Y:\2.xlsx");
-            var myClass = new MyClass()
-            {
-                MyProperty1 = 1,
-                Id = "mcc",
-                Pid = "mc",
-                Parent = new MyClass()
-                {
-                    Id = "mc",
-                    Pid = "ccc",
-                    Parent = new MyClass()
-                    {
-                        Id = "ccc"
-                    }
-                }
-            };
-            var allParent = myClass.AllParent().Append(myClass);
-            var tree = allParent.ToTreeGeneral(c => c.Id, c => c.Pid);
-            Console.WriteLine(tree.ToJsonString(new JsonSerializerSettings()
-            {
-                ReferenceLoopHandling = ReferenceLoopHandling.Ignore,
-                Formatting = Formatting.Indented
-            }));
-            var path = myClass.Path(c => c.Id);
-            Console.WriteLine(path);
+Console.ReadKey();
+Enumerable.Range(1, 2).Select(i => new
+{
+    序号 = i,
+    图片 = new Dictionary<string, FileStream>()
+    {
+        ["https://ldqk.org/1383"] = File.OpenRead(@"D:\images\emotion\16.jpg")
+    }
+}).ToDataTable("aa").ToExcel().SaveFile(@"Y:\2.xlsx");
+var myClass = new MyClass()
+{
+    MyProperty1 = 1,
+    Id = "mcc",
+    Pid = "mc",
+    Parent = new MyClass()
+    {
+        Id = "mc",
+        Pid = "ccc",
+        Parent = new MyClass()
+        {
+            Id = "ccc"
+        }
+    }
+};
+var allParent = myClass.AllParent().Append(myClass);
+var tree = allParent.ToTreeGeneral(c => c.Id, c => c.Pid);
+Console.WriteLine(tree.ToJsonString(new JsonSerializerSettings()
+{
+    ReferenceLoopHandling = ReferenceLoopHandling.Ignore,
+    Formatting = Formatting.Indented
+}));
+var path = myClass.Path(c => c.Id);
+Console.WriteLine(path);
 
-            myClass.SetProperty(nameof(MyClass.MyProperty1), 1);
-            Console.ReadKey();
-            var rsaKey = RsaCrypt.GenerateRsaKeys(RsaKeyType.PKCS8, 2048);
-            Console.WriteLine(rsaKey.PrivateKey);
-            Console.WriteLine(rsaKey.PublicKey);
-            var enc = "123456".RSAEncrypt();
-            Console.WriteLine(enc);
-            Console.Beep();
-            var dec = enc.RSADecrypt();
-            Console.WriteLine(dec);
-            Console.ReadKey();
+myClass.SetProperty(nameof(MyClass.MyProperty1), 1);
+Console.ReadKey();
+var rsaKey = RsaCrypt.GenerateRsaKeys(RsaKeyType.PKCS8, 2048);
+Console.WriteLine(rsaKey.PrivateKey);
+Console.WriteLine(rsaKey.PublicKey);
+var enc = "123456".RSAEncrypt();
+Console.WriteLine(enc);
+Console.Beep();
+var dec = enc.RSADecrypt();
+Console.WriteLine(dec);
+Console.ReadKey();
 
-            //CreateWebHostBuilder(args).Build().Run();
-        }
+//CreateWebHostBuilder(args).Build().Run();
 
-        public static IWebHostBuilder CreateWebHostBuilder(string[] args) =>
-            WebHost.CreateDefaultBuilder(args)
-                .UseStartup<Startup>();
-    }
+static IWebHostBuilder CreateWebHostBuilder(string[] args) =>
+    WebHost.CreateDefaultBuilder(args)
+        .UseStartup<Startup>();
 
-    public class ClassCmd
-    {
-        public string MyProperty { get; set; }
+public class ClassCmd
+{
+    public string MyProperty { get; set; }
 
-        public int Num { get; set; }
-    }
+    public int Num { get; set; }
+}
 
-    public class ClassDto
-    {
-        [DeserializeOnlyJsonProperty]
-        public string MyProperty { get; set; }
+public class ClassDto
+{
+    [DeserializeOnlyJsonProperty]
+    public string MyProperty { get; set; }
 
-        public int Num { get; set; }
-    }
+    public int Num { get; set; }
+}
 
-    public class MyClass : ITree<MyClass>
-    {
-        [Description("test")]
-        public string Pid { get; set; }
+public class MyClass : ITree<MyClass>
+{
+    [Description("test")]
+    public string Pid { get; set; }
 
-        public int? MyProperty1 { get; set; }
+    public int? MyProperty1 { get; set; }
 
-        /// <summary>
-        /// 名字
-        /// </summary>
-        public string Id { get; set; }
+    /// <summary>
+    /// 名字
+    /// </summary>
+    public string Id { get; set; }
 
-        /// <summary>
-        /// 父节点
-        /// </summary>
-        [JsonIgnore]
-        public virtual MyClass Parent { get; set; }
+    /// <summary>
+    /// 父节点
+    /// </summary>
+    [JsonIgnore]
+    public virtual MyClass Parent { get; set; }
 
-        /// <summary>
-        /// 子级
-        /// </summary>
-        [JsonIgnore]
-        public ICollection<MyClass> Children { get; set; } = new List<MyClass>();
+    /// <summary>
+    /// 子级
+    /// </summary>
+    [JsonIgnore]
+    public ICollection<MyClass> Children { get; set; } = new List<MyClass>();
 
-        /// <summary>
-        /// 名字
-        /// </summary>
-        [DeserializeOnlyJsonProperty]
-        public string Name { get; set; }
-    }
+    /// <summary>
+    /// 名字
+    /// </summary>
+    [DeserializeOnlyJsonProperty]
+    public string Name { get; set; }
 }