public static byte[] VisualCaptcha(string source) { try { System.Random r = new System.Random(); int w = 350, h = 75; string family = "Arial Rounded MT Bold"; using (var bmp = new System.Drawing.Bitmap(w, h , System.Drawing.Imaging.PixelFormat.Format32bppArgb)) { int m = 0, nm = 0; System.Drawing.Color tc; using (var g = System.Drawing.Graphics.FromImage(bmp)) { g.TextRenderingHint = System.Drawing.Text.TextRenderingHint.AntiAlias; g.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.HighQuality; g.Clear(System.Drawing.Color.White); System.Drawing.SizeF size; m = r.Next() % 9 + 1; nm = r.Next() % 3; tc = System.Drawing.Color.FromArgb(255, 255, 255); size = g.MeasureString(source , new System.Drawing.Font(family, h * 1.2f, System.Drawing.FontStyle.Bold) , new System.Drawing.SizeF(w * 1F, h * 1F)); using (var brush = new System.Drawing.Drawing2D.LinearGradientBrush( new System.Drawing.Rectangle(0, 0, w, h) , System.Drawing.Color.Black , System.Drawing.Color.Black, 45, false)) { System.Drawing.Drawing2D.ColorBlend blend = new System.Drawing.Drawing2D.ColorBlend(6); for (var i = 0; i < 6; i++) { blend.Positions[i] = i * (1 / 5F); blend.Colors[i] = r.RandomColor(255, 64, 128); } brush.InterpolationColors = blend; for (int wave = 0; wave < 2; wave++) { int min = (15 + wave * 20); System.Drawing.PointF[] pt = new System.Drawing.PointF[] { new System.Drawing.PointF(16f, (float)r.Next(min, min + 10)) , new System.Drawing.PointF(240f, (float)r.Next(min + 10, min + 20)) }; System.Collections.Generic.List <System.Drawing.PointF> PointList = new System.Collections.Generic.List <System.Drawing.PointF>(); float curDist = 0, distance = 0; for (int i = 0; i < pt.Length - 1; i++) { System.Drawing.PointF ptA = pt[i], ptB = pt[i + 1]; float deltaX = ptB.X - ptA.X, deltaY = ptB.Y - ptA.Y; curDist = 0; distance = (float)System.Math.Sqrt(System.Math.Pow(deltaX, 2) + System.Math.Pow(deltaY, 2)); while (curDist < distance) { curDist++; float offsetX = (float)((double)curDist / (double)distance * (double)deltaX); float offsetY = (float)((double)curDist / (double)distance * (double)deltaY); PointList.Add(new System.Drawing.PointF(ptA.X + offsetX, ptA.Y + offsetY)); } } for (int i = 0; i < PointList.Count - 24; i = i + 24) { float x1 = PointList[i].X, y1 = PointList[i].Y, x2 = PointList[i + 24].X, y2 = PointList[i + 24].Y; float angle = (float)((System.Math.Atan2(y2 - y1, x2 - x1) * 180 / 3.14159265)); g.TranslateTransform(x1, y1); g.RotateTransform(angle); int pm = r.Next() % 2 + 1; System.Drawing.Point[] p1 = new System.Drawing.Point[] { new System.Drawing.Point(0, 0) , new System.Drawing.Point(3, -3 * pm) , new System.Drawing.Point(6, -4 * pm) , new System.Drawing.Point(9, -3 * pm) , new System.Drawing.Point(12, 0) , new System.Drawing.Point(15, 3 * pm) , new System.Drawing.Point(18, 4 * pm) , new System.Drawing.Point(21, 3 * pm) , new System.Drawing.Point(24, 0) }; using (var path = new System.Drawing.Drawing2D.GraphicsPath()) g.DrawLines(new System.Drawing.Pen(brush, 2f), p1); g.RotateTransform(-angle); g.TranslateTransform(-x1, -y1); } } using (var path = new System.Drawing.Drawing2D.GraphicsPath()) { System.Drawing.PointF[] points = new System.Drawing.PointF[] { }; if (m == 1 || m == 2 || m == 3) // star trek inverse { path.AddString(source , new System.Drawing.FontFamily(family), 1, h * 0.75F , new System.Drawing.PointF((w - size.Width) / 2F , (h * 0.9F - size.Height) / 2F) , System.Drawing.StringFormat.GenericTypographic); points = new System.Drawing.PointF[] { new System.Drawing.PointF(0, 0) , new System.Drawing.PointF(w, 0) , new System.Drawing.PointF(w * 0.2F, h) , new System.Drawing.PointF(w * 0.8F, h) }; } else if (m == 4 || m == 5) // star trek { path.AddString(source, new System.Drawing.FontFamily(family), 1, h * 0.75F , new System.Drawing.PointF((w - size.Width) / 2F , (h * 1.2F - size.Height) / 2F + 2F) , System.Drawing.StringFormat.GenericTypographic); points = new System.Drawing.PointF[] { new System.Drawing.PointF(w * 0.2F, 0) , new System.Drawing.PointF(w * 0.8F, 0) , new System.Drawing.PointF(0, h) , new System.Drawing.PointF(w, h) }; } else if (m == 6 || m == 7) // grow from left { path.AddString(source, new System.Drawing.FontFamily(family), 1, h * 0.75F , new System.Drawing.PointF((w * 1.15F - size.Width) / 2F , (h - size.Height) / 2F) , System.Drawing.StringFormat.GenericTypographic); points = new System.Drawing.PointF[] { new System.Drawing.PointF(0, h * 0.25F) , new System.Drawing.PointF(w, 0) , new System.Drawing.PointF(0, h * 0.75F) , new System.Drawing.PointF(w, h) }; } else if (m == 8 || m == 9) // grow from right { path.AddString(source, new System.Drawing.FontFamily(family), 1, h * 0.75F , new System.Drawing.PointF((w * 0.85F - size.Width) / 2F , (h - size.Height) / 2F) , System.Drawing.StringFormat.GenericTypographic); points = new System.Drawing.PointF[] { new System.Drawing.PointF(w * 0.1F, 0) , new System.Drawing.PointF(w * 0.9F, h * 0.25F) , new System.Drawing.PointF(w * 0.1F, h) , new System.Drawing.PointF(w * 0.9F, h * 0.75F) }; } path.Warp(points, new System.Drawing.RectangleF(0, 0, w, h)); g.FillPath(System.Drawing.Brushes.White, path); g.DrawPath(new System.Drawing.Pen(brush, 2F), path); } } } using (var thumb = new System.Drawing.Bitmap(128, 40 , System.Drawing.Imaging.PixelFormat.Format32bppArgb)) { using (var g = System.Drawing.Graphics.FromImage(thumb)) { g.CompositingQuality = System.Drawing.Drawing2D.CompositingQuality.HighQuality; g.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.HighQuality; g.InterpolationMode = System.Drawing.Drawing2D.InterpolationMode.HighQualityBicubic; System.Drawing.Rectangle tr = new System.Drawing.Rectangle(0, 0, thumb.Width, thumb.Height); g.DrawImage(bmp, tr); g.DrawRectangle( new System.Drawing.Pen(System.Drawing.Brushes.White) , new System.Drawing.Rectangle(0, 0, 127, 39)); } using (var ms = new System.IO.MemoryStream()) { ((System.Drawing.Image)thumb).Save(ms , System.Drawing.Imaging.ImageFormat.Png); return(ms.ToArray()); } } } } catch { return(null); } }