public override void Create(Graphics graphics, XCaptcha.ICanvas canvas)
        {
            var random = new Random();

            for (var i = 0; i < (canvas.Width * canvas.Height / 10); i++)
            {
                var x = random.Next(canvas.Width);
                var y = random.Next(canvas.Height);
                var w = random.Next(3);
                var h = random.Next(3);

                graphics.FillEllipse(Brush, x, y, w, h);
            }
        }
        public override GraphicsPath Create(GraphicsPath path, XCaptcha.ICanvas canvas)
        {
            var random = new Random();
            var rect = new Rectangle(0, 0, canvas.Width, canvas.Height);

            const float wrapFactor = 8F;

            PointF[] points =
                {
                    new PointF(random.Next(rect.Width) / wrapFactor,random.Next(rect.Height) / wrapFactor),
                    new PointF(rect.Width - random.Next(rect.Width) / wrapFactor, random.Next(rect.Height) / wrapFactor),
                    new PointF(random.Next(rect.Width) / wrapFactor, rect.Height - random.Next(rect.Height) / wrapFactor),
                    new PointF(rect.Width - random.Next(rect.Width) / wrapFactor, rect.Height - random.Next(rect.Height) / wrapFactor)
                };

            var matrix = new Matrix();
            matrix.Translate(0F, 0F);

            path.Warp(points, rect, matrix, WarpMode.Perspective, 0F);

            return path;
        }