Exemplo n.º 1
0
        /// <summary>
        ///
        /// </summary>
        /// <param name="options"></param>
        /// <returns></returns>
        public async Task <(Point[] FontPoints, Image FontImage, Image BoardImage)> GenerateAsync(CaptchaOptions options)
        {
            await Task.FromResult(0);

            var imageFile = Directory
                            .GetFiles(Path.Combine(options.RootDirectory, options.ClickCodeImageDir))
                            .RandomTake(1).SingleOrDefault();

            using var imageOrigin = Image.FromFile(imageFile).Resize(Width, Height, true, true);

            var strs = String.Split(new[] { ' ', ',' }, StringSplitOptions.RemoveEmptyEntries);

            var points    = new List <Point>(strs.Length);
            var imageFont = new Bitmap(FontSize / 2 * String.Length + (int)(FontSize / 2 * 1.5D), (int)(FontSize / 2 * 1.5D));

            using var graphicsFont = Graphics.FromImage(imageFont);
            graphicsFont.Clear(CaptchaHelper.RandomColor(false));
            //绘制干扰线
            for (int i = 0; i < 4; i++)
            {
                var random = new Random(Guid.NewGuid().GetHashCode());
                var x      = random.Next(imageFont.Width);
                var y      = random.Next(imageFont.Height);
                var x1     = random.Next(imageFont.Width);
                var y1     = random.Next(imageFont.Height);
                var x2     = random.Next(imageFont.Width);
                var y2     = random.Next(imageFont.Height);
                var x3     = random.Next(imageFont.Width);
                var y3     = random.Next(imageFont.Height);
                using var pen = new Pen(CaptchaHelper.RandomColor(true));
                graphicsFont.DrawBezier(pen, x, y, x1, y1, x2, y2, x3, y3);
            }

            var imageBoard = (Image)imageOrigin.Clone();

            using var graphicsBoard = Graphics.FromImage(imageBoard);

            //绘制文字
            for (int i = 0; i < strs.Length; i++)
            {
                var item   = strs[i];
                var random = new Random(Guid.NewGuid().GetHashCode());
                using var pen = new Pen(CaptchaHelper.RandomColor());

                using var font1 = new Font(options.FontFamilies[random.Next(options.FontFamilies.Length)], FontSize / 2, options.FontStyles[random.Next(options.FontStyles.Length)]);
                graphicsFont.DrawString(item, font1, pen.Brush, FontSize * i, 0);

                var point = new Point(random.Next(0, Width - item.Length * FontSize - FontSize), random.Next(0, Height - FontSize - FontSize));
                using var font2 = new Font(options.FontFamilies[random.Next(options.FontFamilies.Length)], FontSize, options.FontStyles[random.Next(options.FontStyles.Length)]);
                graphicsBoard.DrawString(item, font2, pen.Brush, point);

                points.Add(point);
            }

            return(points.ToArray(), imageFont, imageBoard);
        }
Exemplo n.º 2
0
        /// <summary>
        ///
        /// </summary>
        /// <param name="strings"></param>
        /// <param name="options"></param>
        /// <returns></returns>
        public Image Generate(IEnumerable <string> strings, CaptchaOptions options)
        {
            var bg      = new Random(Guid.NewGuid().GetHashCode()).NextBool();
            var bgColor = CaptchaHelper.RandomColor(bg);

            var image = new Bitmap(Width, Height);

            using var graphics         = Graphics.FromImage(image);
            graphics.InterpolationMode = System.Drawing.Drawing2D.InterpolationMode.High;    //设置高质量插值法
            graphics.SmoothingMode     = System.Drawing.Drawing2D.SmoothingMode.HighQuality; //设置高质量,低速度呈现平滑程度
            graphics.Clear(bgColor);                                                         //设置背景

            //绘制字符
            var charCount = strings.Sum(_ => _.Length);
            var charWidth = (float)image.Width / (charCount + 3);//字符所占宽度
            var charLeft  = FontSize / 2F;

            if (!GenerateGif)
            {
                //绘制干扰线
                for (int i = 0; i < 6; i++)
                {
                    var random = new Random(Guid.NewGuid().GetHashCode());
                    var x      = random.Next(image.Width);
                    var y      = random.Next(image.Height);
                    var x1     = random.Next(image.Width);
                    var y1     = random.Next(image.Height);
                    var x2     = random.Next(image.Width);
                    var y2     = random.Next(image.Height);
                    var x3     = random.Next(image.Width);
                    var y3     = random.Next(image.Height);
                    using var pen = new Pen(CaptchaHelper.RandomColor(!bg));
                    graphics.DrawBezier(pen, x, y, x1, y1, x2, y2, x3, y3);
                }

                foreach (var str in strings)
                {
                    var random = new Random(Guid.NewGuid().GetHashCode());
                    using var font = new Font(options.FontFamilies[random.Next(options.FontFamilies.Length)], FontSize, options.FontStyles[random.Next(options.FontStyles.Length)]);
                    using var pen  = new Pen(CaptchaHelper.RandomColor(!bg));
                    graphics.DrawString(str, font, pen.Brush, charLeft, random.Next(-FontSize / 2, FontSize / 2));
                    charLeft += str.Length * charWidth;
                }

                return(image);
            }
            else
            {
                using var memory = new MemoryStream();
                using var gif    = new GIFWriter(memory, 500, 0);
                gif.WriteFrame(image);

                foreach (var str in strings)
                {
                    using var _image    = new Bitmap(image.Width, image.Height);
                    using var _graphics = Graphics.FromImage(_image);
                    _graphics.Clear(bgColor);

                    //绘制干扰线
                    for (int i = 0; i < 3; i++)
                    {
                        var _random = new Random(Guid.NewGuid().GetHashCode());
                        var x       = _random.Next(image.Width);
                        var y       = _random.Next(image.Height);
                        var x1      = _random.Next(image.Width);
                        var y1      = _random.Next(image.Height);
                        var x2      = _random.Next(image.Width);
                        var y2      = _random.Next(image.Height);
                        var x3      = _random.Next(image.Width);
                        var y3      = _random.Next(image.Height);
                        using var _pen = new Pen(CaptchaHelper.RandomColor(!bg));
                        _graphics.DrawBezier(_pen, x, y, x1, y1, x2, y2, x3, y3);
                    }

                    var random = new Random(Guid.NewGuid().GetHashCode());
                    using var font = new Font(options.FontFamilies[random.Next(options.FontFamilies.Length)], FontSize, options.FontStyles[random.Next(options.FontStyles.Length)]);
                    using var pen  = new Pen(CaptchaHelper.RandomColor(!bg));
                    _graphics.DrawString(str, font, pen.Brush, charLeft, random.Next(0, FontSize / 2));

                    charLeft += str.Length * charWidth;

                    gif.WriteFrame(_image);
                }

                return(Image.FromStream(memory));
            }
        }