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