diff --git a/api/SimpleAdmin/SimpleAdmin.Core/SimpleAdmin.Core.csproj b/api/SimpleAdmin/SimpleAdmin.Core/SimpleAdmin.Core.csproj index b50e295505a671e4db98021cc4b79b482134e034..b6e71be59308febf19a2657070ab906ffead6c31 100644 --- a/api/SimpleAdmin/SimpleAdmin.Core/SimpleAdmin.Core.csproj +++ b/api/SimpleAdmin/SimpleAdmin.Core/SimpleAdmin.Core.csproj @@ -10,18 +10,19 @@ - - - - + + + + + - - + + + - - + diff --git a/api/SimpleAdmin/SimpleAdmin.Core/SimpleAdmin.Core.xml b/api/SimpleAdmin/SimpleAdmin.Core/SimpleAdmin.Core.xml index 38189206fc04aecb1eb0e8447e0935517f8c02af..16526aee6d14633714e7f0429058001d943dc1f6 100644 --- a/api/SimpleAdmin/SimpleAdmin.Core/SimpleAdmin.Core.xml +++ b/api/SimpleAdmin/SimpleAdmin.Core/SimpleAdmin.Core.xml @@ -924,25 +924,18 @@ 待判断字符或字符串 真:是汉字;假:不是 - - - bitmap转byte数组 - - - - - + 图片转换成base64 - + 图片转换成base64 - + @@ -959,15 +952,7 @@ - - - 重新修改尺寸 - - 图片 - 尺寸 - - - + Resize图片 @@ -976,7 +961,7 @@ 新的高度 处理以后的图片 - + 获取缩略图 diff --git a/api/SimpleAdmin/SimpleAdmin.Core/Startup.cs b/api/SimpleAdmin/SimpleAdmin.Core/Startup.cs index 6e1baea6ee90a8675a72a5d868bb13adb217627b..99ece5b1bac84e7dabe6a7f30d3f3a5a415fa5d4 100644 --- a/api/SimpleAdmin/SimpleAdmin.Core/Startup.cs +++ b/api/SimpleAdmin/SimpleAdmin.Core/Startup.cs @@ -16,6 +16,8 @@ public class Startup : AppStartup { WorkerId = 1// 取值范围0~63,默认1 }); + // 配置验证码 + services.AddCaptcha(App.Configuration); } public void Configure(IApplicationBuilder app, IWebHostEnvironment env) diff --git a/api/SimpleAdmin/SimpleAdmin.Core/Utils/Captcha/CaptchaUtil.cs b/api/SimpleAdmin/SimpleAdmin.Core/Utils/Captcha/CaptchaUtil.cs index fb9b65fd7f90db5088bf41de49599c7b5bd4b14b..d106725c6836049ad5c6db97f0e292ea23d9f93e 100644 --- a/api/SimpleAdmin/SimpleAdmin.Core/Utils/Captcha/CaptchaUtil.cs +++ b/api/SimpleAdmin/SimpleAdmin.Core/Utils/Captcha/CaptchaUtil.cs @@ -1,5 +1,7 @@ -using System.DrawingCore; -using System.DrawingCore.Imaging; +using Lazy.Captcha.Core.Generator.Image.Option; +using Lazy.Captcha.Core.Generator.Image; +using Lazy.Captcha.Core; +using SkiaSharp; namespace SimpleAdmin.Core.Utils; @@ -30,68 +32,31 @@ public static class CaptchaUtil case "ARITH": charCode = CreateArithCode(out resultCode); - length = charCode.Length; break; default: charCode = CreateCharCode(length); break; } - //颜色列表 - Color[] colors = { Color.Black, Color.Red, Color.Blue, Color.Green, Color.Orange, Color.Brown, Color.DarkBlue }; - //字体列表 - string[] fonts = { "Times New Roman", "Verdana", "Arial", "Gungsuh" }; - //创建画布 - Bitmap bitmap = new Bitmap(width, heigh); - Graphics graphics = Graphics.FromImage(bitmap); - graphics.Clear(Color.White); - Random random = new Random(); - //画躁线 - for (int i = 0; i < length; i++) - { - int x1 = random.Next(width); - int y1 = random.Next(heigh); - int x2 = random.Next(width); - int y2 = random.Next(heigh); - Color color = colors[random.Next(colors.Length)]; - Pen pen = new Pen(color); - graphics.DrawLine(pen, x1, y1, x2, y2); - } - //画噪点 - for (int i = 0; i < 100; i++) - { - int x = random.Next(width); - int y = random.Next(heigh); - Color color = colors[random.Next(colors.Length)]; - bitmap.SetPixel(x, y, color); - } - //画验证码 - for (int i = 0; i < length; i++) - { - string fontStr = fonts[random.Next(fonts.Length)]; - Font font = new Font(fontStr, fontSize); - Color color = colors[random.Next(colors.Length)]; - //graphics.DrawString(charCode[i].ToString(), font, new SolidBrush(color), (float)i * 30 + 5, (float)0); - graphics.DrawString(charCode[i].ToString(), font, new SolidBrush(color), (float)i * 25, 5); - } - //写入内存流 - try + + var imageGenerator = new DefaultCaptchaImageGenerator(); + var imageGeneratorOption = new CaptchaImageGeneratorOption() { - MemoryStream stream = new MemoryStream(); - bitmap.Save(stream, ImageFormat.Jpeg); - CaptchaInfo captchaInfo = new CaptchaInfo() - { - Code = type.ToString() == "ARITH" ? resultCode : charCode, - Image = stream.ToArray() - }; - return captchaInfo; - } - //释放资源 - finally + // 必须设置 + ForegroundColors = DefaultColors.Instance.Colors, + Width = width, + Height = heigh, + FontSize = fontSize, + FontFamily = DefaultFontFamilys.Instance.Actionj + }; + var bytes = imageGenerator.Generate(charCode, imageGeneratorOption); + + CaptchaInfo captchaInfo = new CaptchaInfo() { - graphics.Dispose(); - bitmap.Dispose(); - } + Code = type.ToString() == "ARITH" ? resultCode : charCode, + Image = bytes + }; + return captchaInfo; } /// diff --git a/api/SimpleAdmin/SimpleAdmin.Core/Utils/Image/AvatarUtil.cs b/api/SimpleAdmin/SimpleAdmin.Core/Utils/Image/AvatarUtil.cs index 7c1195cadb779a55eaa4dab70a96c7ec4c46943c..4be021683c91b07c4d722a8375728b780877149c 100644 --- a/api/SimpleAdmin/SimpleAdmin.Core/Utils/Image/AvatarUtil.cs +++ b/api/SimpleAdmin/SimpleAdmin.Core/Utils/Image/AvatarUtil.cs @@ -1,4 +1,4 @@ -using System.DrawingCore; +using SkiaSharp; namespace SimpleAdmin.Core.Utils; @@ -39,7 +39,7 @@ public static class AvatarUtil /// /// /// - public static Bitmap GetNameImage(string name, int width = 100, int height = 100) + public static SKBitmap GetNameImage(string name, int width = 100, int height = 100) { string color = GetNameColor(name);//获取颜色 var nameLength = name.Length;//获取姓名长度 @@ -59,17 +59,27 @@ public static class AvatarUtil nameWritten = name.Substring(0, 2).ToUpper(); } } + //string firstName = name.Substring(0, 1); - Bitmap img = new Bitmap(width, height); - Graphics g = Graphics.FromImage(img); - Brush brush = new SolidBrush(ColorTranslator.FromHtml(color)); - g.FillRectangle(brush, 0, 0, width, height); - //填充文字 - Font font = new Font("微软雅黑", 25); - SizeF firstSize = g.MeasureString(nameWritten, font); - g.DrawString(nameWritten, font, Brushes.White, new PointF((img.Width - firstSize.Width) / 2, (img.Height - firstSize.Height) / 2)); - g.Dispose(); - return img; + SKBitmap bmp = new SKBitmap(width, height); + using (SKCanvas canvas = new SKCanvas(bmp)) + { + canvas.DrawColor(SKColor.Parse(color)); + using (SKPaint sKPaint = new SKPaint()) + { + sKPaint.Color = SKColors.White;//字体颜色 + sKPaint.TextSize = 25;//字体大小 + sKPaint.IsAntialias = true;//开启抗锯齿 + sKPaint.Typeface = SKTypeface.FromFamilyName("微软雅黑");//字体 + SKRect size = new SKRect(); + sKPaint.MeasureText(nameWritten, ref size);//计算文字宽度以及高度 + float temp = (bmp.Width - size.Size.Width) / 2; + float temp1 = (bmp.Height - size.Size.Height) / 2; + canvas.DrawText(nameWritten, temp, temp1 - size.Top, sKPaint);//画文字 + } + } + + return bmp; } /// @@ -81,7 +91,7 @@ public static class AvatarUtil /// public static string GetNameImageBase64(string name, int width = 100, int height = 100) { - Bitmap img = GetNameImage(name, width, height); + SKBitmap img = GetNameImage(name, width, height); var imgByte = img.ImgToBase64String(); return $"data:image/png;base64," + imgByte; } diff --git a/api/SimpleAdmin/SimpleAdmin.Core/Utils/Image/ImageUtil.cs b/api/SimpleAdmin/SimpleAdmin.Core/Utils/Image/ImageUtil.cs index 836e7a6510e21bcab5537eff78f5893c85dbc2fa..3bcc6dc5e380e9457c9ac65bf8662a0b535d5673 100644 --- a/api/SimpleAdmin/SimpleAdmin.Core/Utils/Image/ImageUtil.cs +++ b/api/SimpleAdmin/SimpleAdmin.Core/Utils/Image/ImageUtil.cs @@ -1,66 +1,45 @@ -using System.DrawingCore; -using System.DrawingCore.Drawing2D; -using System.DrawingCore.Imaging; +using SkiaSharp; namespace SimpleAdmin.Core.Utils; public static class ImageUtil { - /// - /// bitmap转byte数组 - /// - /// - /// - public static byte[] GetBytesFromBitmap(this Bitmap bitmap) - { - MemoryStream ms = new MemoryStream(); - bitmap.Save(ms, ImageFormat.Bmp); - byte[] bytes = ms.GetBuffer(); //byte[] bytes= ms.ToArray(); 这两句都可以,至于区别么,下面有解释 - ms.Close(); - return bytes; - } - /// /// 图片转换成base64 /// /// /// - public static string ImgToBase64String(this Bitmap bmp) + public static string ImgToBase64String(this SKBitmap bmp) { try { - MemoryStream ms = new MemoryStream(); - bmp.Save(ms, ImageFormat.Png); - byte[] arr = new byte[ms.Length]; - ms.Position = 0; - ms.Read(arr, 0, (int)ms.Length); - ms.Close(); + SKImage img = SKImage.FromBitmap(bmp); + SKData p = img.Encode(SKEncodedImageFormat.Png, 100); + byte[] arr = p.ToArray(); return Convert.ToBase64String(arr); } catch { - return null; + return string.Empty; } } /// /// 图片转换成base64 /// - /// + /// /// - public static string ImgToBase64String(Image bmp) + public static string ImgToBase64String(SKImage img) { try { - MemoryStream ms = new MemoryStream(); - bmp.Save(ms, ImageFormat.Png); - byte[] arr = new byte[ms.Length]; ms.Position = 0; - ms.Read(arr, 0, (int)ms.Length); ms.Close(); + SKData p = img.Encode(SKEncodedImageFormat.Png, 100); + byte[] arr = p.ToArray(); return Convert.ToBase64String(arr); } - catch (Exception) + catch { - return ""; + return string.Empty; } } @@ -69,12 +48,10 @@ public static class ImageUtil /// /// /// - public static Bitmap GetBitmapFromBase64(this string base64string) + public static SKBitmap GetBitmapFromBase64(this string base64string) { byte[] b = Convert.FromBase64String(base64string); - MemoryStream ms = new MemoryStream(b); - Bitmap bitmap = new Bitmap(ms); - ms.Close(); + SKBitmap bitmap = SKBitmap.Decode(b); return bitmap; } @@ -88,45 +65,6 @@ public static class ImageUtil return "data:image/png;base64," + base64string; } - /// - /// 重新修改尺寸 - /// - /// 图片 - /// 尺寸 - /// - public static Bitmap ResizeImage(System.DrawingCore.Image imgToResize, Size size) - { - //获取图片宽度 - int sourceWidth = imgToResize.Width; - //获取图片高度 - int sourceHeight = imgToResize.Height; - - float nPercent = 0; - float nPercentW = 0; - float nPercentH = 0; - //计算宽度的缩放比例 - nPercentW = (size.Width / (float)sourceWidth); - //计算高度的缩放比例 - nPercentH = (size.Height / (float)sourceHeight); - - if (nPercentH < nPercentW) - nPercent = nPercentH; - else - nPercent = nPercentW; - //期望的宽度 - int destWidth = (int)(sourceWidth * nPercent); - //期望的高度 - int destHeight = (int)(sourceHeight * nPercent); - - Bitmap b = new Bitmap(destWidth, destHeight); - Graphics g = Graphics.FromImage(b); - g.InterpolationMode = InterpolationMode.HighQualityBicubic; - //绘制图像 - g.DrawImage(imgToResize, 0, 0, destWidth, destHeight); - g.Dispose(); - return b; - } - /// /// Resize图片 /// @@ -134,16 +72,17 @@ public static class ImageUtil /// 新的宽度 /// 新的高度 /// 处理以后的图片 - public static Bitmap ResizeImage(this Bitmap bmp, int newW, int newH) + public static SKBitmap ResizeImage(this SKBitmap bmp, int newW, int newH) { try { - Bitmap b = new Bitmap(newW, newH); - Graphics g = Graphics.FromImage(b); - // 插值算法的质量 - g.InterpolationMode = InterpolationMode.HighQualityBicubic; - g.DrawImage(bmp, new Rectangle(0, 0, newW, newH), new Rectangle(0, 0, bmp.Width, bmp.Height), GraphicsUnit.Pixel); - g.Dispose(); + SKBitmap b = new (newW, newH); + var resized = b.Resize(new SKImageInfo(newW, newH), SKFilterQuality.High); + if (resized is null) + { + return null; + } + var image = SKImage.FromBitmap(resized); return b; } catch @@ -159,15 +98,19 @@ public static class ImageUtil /// 宽 /// 高 /// - public static Image GetPicThumbnail(this Bitmap bmp, int w, int h) + public static SKImage GetPicThumbnail(this SKBitmap bmp, int w, int h) { try { - Image thumbnail = bmp.GetThumbnailImage( - w, h, () => false, IntPtr.Zero); - return thumbnail; + var resized = bmp.Resize(new SKImageInfo(w, h), SKFilterQuality.Medium); + if (resized is null) + { + return null; + } + var image = SKImage.FromBitmap(resized); + return image; } - catch (Exception ex) + catch (Exception) { return null; } diff --git a/api/SimpleAdmin/SimpleAdmin.Plugin/SimpleAdmin.Plugin.Cache/SimpleAdmin.Plugin.Cache.csproj b/api/SimpleAdmin/SimpleAdmin.Plugin/SimpleAdmin.Plugin.Cache/SimpleAdmin.Plugin.Cache.csproj index c8a197fa1d759c578b88947aa35480b0a8aef5ac..5186264f5efd5f8ff9fddd777c15e7299bdb932b 100644 --- a/api/SimpleAdmin/SimpleAdmin.Plugin/SimpleAdmin.Plugin.Cache/SimpleAdmin.Plugin.Cache.csproj +++ b/api/SimpleAdmin/SimpleAdmin.Plugin/SimpleAdmin.Plugin.Cache/SimpleAdmin.Plugin.Cache.csproj @@ -9,7 +9,7 @@ - + diff --git a/api/SimpleAdmin/SimpleAdmin.Plugin/SimpleAdmin.Plugin.Mqtt/SimpleAdmin.Plugin.Mqtt.csproj b/api/SimpleAdmin/SimpleAdmin.Plugin/SimpleAdmin.Plugin.Mqtt/SimpleAdmin.Plugin.Mqtt.csproj index 3d3cbd62521ffe9d82fb1adf05bc648f57db5207..cbe0280bcf13700af22bd95a15abe186dcaf0645 100644 --- a/api/SimpleAdmin/SimpleAdmin.Plugin/SimpleAdmin.Plugin.Mqtt/SimpleAdmin.Plugin.Mqtt.csproj +++ b/api/SimpleAdmin/SimpleAdmin.Plugin/SimpleAdmin.Plugin.Mqtt/SimpleAdmin.Plugin.Mqtt.csproj @@ -9,7 +9,7 @@ - + diff --git a/api/SimpleAdmin/SimpleAdmin.Plugin/SimpleAdmin.Plugin.SqlSugar/SimpleAdmin.Plugin.SqlSugar.xml b/api/SimpleAdmin/SimpleAdmin.Plugin/SimpleAdmin.Plugin.SqlSugar/SimpleAdmin.Plugin.SqlSugar.xml index b2000b3dc7641775012cc7a34c855fcb201d1cae..b9d1c5082024337d0f8c10bd82762f21d2077f66 100644 --- a/api/SimpleAdmin/SimpleAdmin.Plugin/SimpleAdmin.Plugin.SqlSugar/SimpleAdmin.Plugin.SqlSugar.xml +++ b/api/SimpleAdmin/SimpleAdmin.Plugin/SimpleAdmin.Plugin.SqlSugar/SimpleAdmin.Plugin.SqlSugar.xml @@ -1461,7 +1461,7 @@ - 字节点 + 子节点 diff --git a/api/SimpleAdmin/SimpleAdmin.System/Services/Dev/File/FileService.cs b/api/SimpleAdmin/SimpleAdmin.System/Services/Dev/File/FileService.cs index 56016305d66127066a908daff0a79b9f80ddefdb..02835825594c702cc7e9f09673a68509ceaac2d6 100644 --- a/api/SimpleAdmin/SimpleAdmin.System/Services/Dev/File/FileService.cs +++ b/api/SimpleAdmin/SimpleAdmin.System/Services/Dev/File/FileService.cs @@ -1,4 +1,4 @@ -using System.DrawingCore; +using SkiaSharp; using System.Runtime.InteropServices; using System.Web; @@ -158,8 +158,9 @@ public class FileService : DbRepository, IFileService { //$"data:image/png;base64," + imgByte; using var fileStream = file.OpenReadStream();//获取文件流 - var image = Image.FromStream(fileStream);//获取图片 - var thubnail = image.GetThumbnailImage(100, 100, () => false, IntPtr.Zero);//压缩图片 + SKImage image = SKImage.FromEncodedData(fileStream);//获取图片 + SKBitmap bmp = SKBitmap.FromImage(image); + var thubnail = bmp.GetPicThumbnail(100, 100);//压缩图片 var thubnailBase64 = ImageUtil.ImgToBase64String(thubnail);//转base64 devFile.Thumbnail = $"data:image/png;base64," + thubnailBase64; } diff --git a/api/SimpleAdmin/SimpleAdmin.System/SimpleAdmin.System.xml b/api/SimpleAdmin/SimpleAdmin.System/SimpleAdmin.System.xml index 4b29d09c395a48b79936fbf83950fd6e18e4cc78..d9712c24d083d0fa2d612703417b688cc23f5ad2 100644 --- a/api/SimpleAdmin/SimpleAdmin.System/SimpleAdmin.System.xml +++ b/api/SimpleAdmin/SimpleAdmin.System/SimpleAdmin.System.xml @@ -4168,7 +4168,7 @@ 获取Sqlsugar的ISugarQueryable - + diff --git a/api/dockerfile b/api/dockerfile index 5ba131b00999e6c5500798f695a2c271f2f39805..0a989aa16b79269848b1faefbec45dd233627208 100644 --- a/api/dockerfile +++ b/api/dockerfile @@ -13,4 +13,12 @@ RUN dotnet publish "SimpleAdmin.Web.Entry/SimpleAdmin.Web.Entry.csproj" --framew FROM mcr.microsoft.com/dotnet/aspnet:7.0 AS runtime WORKDIR /app COPY --from=publish /app/publish . + +#修改apt-get源,加速apt下载 +RUN sed -i s@/deb.debian.org/@/mirrors.163.com/@g /etc/apt/sources.list +RUN cat /etc/apt/sources.list +#安装fontconfig +RUN apt-get clean +RUN apt-get update && apt-get install -y fontconfig + ENTRYPOINT ["dotnet", "SimpleAdmin.Web.Entry.dll"]