¶Ô±ÈÐÂÎļþ |
| | |
| | | using SkiaSharp; |
| | | using System; |
| | | using System.Collections.Generic; |
| | | using System.Drawing; |
| | | using System.IO; |
| | | using System.Linq; |
| | | using System.Text; |
| | | using System.Threading.Tasks; |
| | | |
| | | namespace WIDESEA_Core.Utilities |
| | | { |
| | | public static class VierificationCode |
| | | { |
| | | private static readonly string[] _chars = new string[] { "0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k", "l", "m", "n", "p", "q", "r", "s", "t", "u", "v", "w", "x", "y", "z", "A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L", "M", "N", "P", "P", "Q", "R", "S", "T", "U", "V", "W", "X", "Y", "Z" }; |
| | | |
| | | private static readonly SKColor[] colors = { SKColors.Black, SKColors.Green, SKColors.Brown }; |
| | | |
| | | private static readonly string[] fonts = { "Verdana", "Microsoft Sans Serif", "Comic Sans MS", "Arial", "å®ä½" }; |
| | | public static string RandomText() |
| | | { |
| | | string code = "";//产ççéæºæ° |
| | | int temp = -1; |
| | | Random rand = new Random(); |
| | | for (int i = 1; i < 5; i++) |
| | | { |
| | | if (temp != -1) |
| | | { |
| | | rand = new Random(i * temp * unchecked((int)DateTime.Now.Ticks)); |
| | | } |
| | | int t = rand.Next(61); |
| | | if (temp != -1 && temp == t) |
| | | { |
| | | return RandomText(); |
| | | } |
| | | temp = t; |
| | | code += _chars[t]; |
| | | } |
| | | return code; |
| | | } |
| | | public static string CreateBase64Imgage(string code) |
| | | { |
| | | var random = new Random(); |
| | | var info = new SKImageInfo((int)code.Length * 18, 32); |
| | | using var bitmap = new SKBitmap(info); |
| | | using var canvas = new SKCanvas(bitmap); |
| | | |
| | | canvas.Clear(SKColors.White); |
| | | |
| | | using var pen = new SKPaint(); |
| | | pen.FakeBoldText = true; |
| | | pen.Style = SKPaintStyle.Fill; |
| | | pen.TextSize = 20;// 0.6f * info.Width * pen.TextSize / pen.MeasureText(code); |
| | | |
| | | //ç»å¶éæºå符 |
| | | for (int i = 0; i < code.Length; i++) |
| | | { |
| | | pen.Color = random.GetRandom(colors);//éæºé¢è²ç´¢å¼å¼ |
| | | |
| | | pen.Typeface = SKTypeface.FromFamilyName(random.GetRandom(fonts), 700, 20, SKFontStyleSlant.Italic);//é
ç½®åä½ |
| | | var point = new SKPoint() |
| | | { |
| | | X = i * 16, |
| | | Y = 22// info.Height - ((i + 1) % 2 == 0 ? 2 : 4), |
| | | |
| | | }; |
| | | canvas.DrawText(code.Substring(i, 1), point, pen);//ç»å¶ä¸ä¸ªéªè¯å符 |
| | | |
| | | } |
| | | |
| | | // ç»å¶åªç¹ |
| | | var points = Enumerable.Range(0, 100).Select( |
| | | _ => new SKPoint(random.Next(bitmap.Width), random.Next(bitmap.Height)) |
| | | ).ToArray(); |
| | | canvas.DrawPoints( |
| | | SKPointMode.Points, |
| | | points, |
| | | pen); |
| | | |
| | | //ç»å¶è´å¡å°çº¿æ¡ |
| | | for (int i = 0; i < 2; i++) |
| | | { |
| | | var p1 = new SKPoint(0, 0); |
| | | var p2 = new SKPoint(0, 0); |
| | | var p3 = new SKPoint(0, 0); |
| | | var p4 = new SKPoint(0, 0); |
| | | |
| | | var touchPoints = new SKPoint[] { p1, p2, p3, p4 }; |
| | | |
| | | using var bPen = new SKPaint(); |
| | | bPen.Color = random.GetRandom(colors); |
| | | bPen.Style = SKPaintStyle.Stroke; |
| | | |
| | | using var path = new SKPath(); |
| | | path.MoveTo(touchPoints[0]); |
| | | path.CubicTo(touchPoints[1], touchPoints[2], touchPoints[3]); |
| | | canvas.DrawPath(path, bPen); |
| | | } |
| | | return bitmap.ToBase64String(SKEncodedImageFormat.Png); |
| | | } |
| | | |
| | | public static T GetRandom<T>(this Random random, T[] tArray) |
| | | { |
| | | if (random == null) random = new Random(); |
| | | return tArray[random.Next(tArray.Length)]; |
| | | } |
| | | |
| | | /// <summary> |
| | | /// SKBitmap转Base64String |
| | | /// </summary> |
| | | /// <param name="bitmap"></param> |
| | | /// <param name="format"></param> |
| | | /// <returns></returns> |
| | | public static string ToBase64String(this SKBitmap bitmap, SKEncodedImageFormat format) |
| | | { |
| | | using var memStream = new MemoryStream(); |
| | | using var wstream = new SKManagedWStream(memStream); |
| | | bitmap.Encode(wstream, format, 32); |
| | | memStream.TryGetBuffer(out ArraySegment<byte> buffer); |
| | | return $"{Convert.ToBase64String(buffer.Array, 0, (int)memStream.Length)}"; |
| | | } |
| | | } |
| | | } |