From d7f5176e90e9fd8be84bd72e3dd3983a8a53645b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E4=B8=80=E5=85=8B=E7=8C=AB?= <11649976+onegcat@user.noreply.gitee.com> Date: Mon, 8 May 2023 21:46:09 +0800 Subject: [PATCH 1/2] =?UTF-8?q?1.=E5=8D=87=E7=BA=A7=E4=BE=9D=E8=B5=96?= =?UTF-8?q?=E7=89=88=E6=9C=AC=202.=E9=AA=8C=E8=AF=81=E7=A0=81=E7=94=9F?= =?UTF-8?q?=E6=88=90=E4=BD=BF=E7=94=A8LazyCaptcha=203.ZKWeb.System.Drawing?= =?UTF-8?q?=E6=9B=B4=E6=8D=A2=E4=B8=BASkiaSharp?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../SimpleAdmin.Core/SimpleAdmin.Core.csproj | 17 +-- .../SimpleAdmin.Core/SimpleAdmin.Core.xml | 25 +--- api/SimpleAdmin/SimpleAdmin.Core/Startup.cs | 2 + .../Utils/Captcha/CaptchaUtil.cs | 77 ++++-------- .../Utils/Image/AvatarUtil.cs | 36 ++++-- .../SimpleAdmin.Core/Utils/Image/ImageUtil.cs | 119 +++++------------- .../SimpleAdmin.Plugin.Cache.csproj | 2 +- .../SimpleAdmin.Plugin.Mqtt.csproj | 2 +- .../SimpleAdmin.Plugin.SqlSugar.xml | 2 +- .../Services/Dev/File/FileService.cs | 7 +- .../SimpleAdmin.System/SimpleAdmin.System.xml | 2 +- api/dockerfile | 8 ++ 12 files changed, 107 insertions(+), 192 deletions(-) diff --git a/api/SimpleAdmin/SimpleAdmin.Core/SimpleAdmin.Core.csproj b/api/SimpleAdmin/SimpleAdmin.Core/SimpleAdmin.Core.csproj index b50e295..b6e71be 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 3818920..16526ae 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 6e1baea..99ece5b 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 fb9b65f..d106725 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 7c1195c..4be0216 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 836e7a6..3bcc6dc 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 c8a197f..5186264 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 3d3cbd6..cbe0280 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 b2000b3..b9d1c50 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 5601630..7bd2d79 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);//压缩图片 + using SKImage image = SKImage.FromEncodedData(fileStream);//获取图片 + using 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 4b29d09..d9712c2 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 5ba131b..0a989aa 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"] -- Gitee From 040b701dc7f67cb859b4c4b4bcb252818adec94d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E4=B8=80=E5=85=8B=E7=8C=AB?= <11649976+onegcat@user.noreply.gitee.com> Date: Mon, 8 May 2023 21:51:35 +0800 Subject: [PATCH 2/2] =?UTF-8?q?1.=E5=8D=87=E7=BA=A7=E4=BE=9D=E8=B5=96?= =?UTF-8?q?=E7=89=88=E6=9C=AC=202.=E9=AA=8C=E8=AF=81=E7=A0=81=E7=94=9F?= =?UTF-8?q?=E6=88=90=E4=BD=BF=E7=94=A8LazyCaptcha=203.ZKWeb.System.Drawing?= =?UTF-8?q?=E6=9B=B4=E6=8D=A2=E4=B8=BASkiaSharp?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../SimpleAdmin.System/Services/Dev/File/FileService.cs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/api/SimpleAdmin/SimpleAdmin.System/Services/Dev/File/FileService.cs b/api/SimpleAdmin/SimpleAdmin.System/Services/Dev/File/FileService.cs index 7bd2d79..0283582 100644 --- a/api/SimpleAdmin/SimpleAdmin.System/Services/Dev/File/FileService.cs +++ b/api/SimpleAdmin/SimpleAdmin.System/Services/Dev/File/FileService.cs @@ -158,8 +158,8 @@ public class FileService : DbRepository, IFileService { //$"data:image/png;base64," + imgByte; using var fileStream = file.OpenReadStream();//获取文件流 - using SKImage image = SKImage.FromEncodedData(fileStream);//获取图片 - using SKBitmap bmp = SKBitmap.FromImage(image); + 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; -- Gitee