/// <summary> /// Creates the captcha image. /// </summary> public byte[] DrawCaptcha(string message, string foreColor, float fontSize, string fontName) { return(useFont(fontName, fontSize, captchaFont => { var fColor = ColorTranslator.FromHtml(foreColor); message = message.Replace(",", string.Empty, StringComparison.Ordinal); const int margin = 8; var captchaSize = measureString(message, captchaFont); var height = (int)captchaSize.Height + margin; var width = (int)captchaSize.Width + margin; using var pic = new Bitmap(width, height, PixelFormat.Format24bppRgb); var data = pic.LockBits(new Rectangle(0, 0, pic.Width, pic.Height), ImageLockMode.WriteOnly, pic.PixelFormat); var noise = new byte[data.Width * data.Height * 3]; _randomNumberProvider.NextBytes(noise); Marshal.Copy(noise, 0, data.Scan0, noise.Length); pic.UnlockBits(data); using (var graphics = Graphics.FromImage(pic)) { var stringFormat = new StringFormat { Alignment = StringAlignment.Center, LineAlignment = StringAlignment.Center }; graphics.DrawString(message, captchaFont, new SolidBrush(fColor), new RectangleF(0, 0, pic.Width, pic.Height), stringFormat); for (var i = 0; i < 30; i++) { var x0 = _randomNumberProvider.NextNumber(0, width); var y0 = _randomNumberProvider.NextNumber(0, height); var x1 = _randomNumberProvider.NextNumber(0, width); var y1 = _randomNumberProvider.NextNumber(0, height); graphics.DrawLine(Pens.White, x0, y0, x1, y1); } } using var stream = new MemoryStream(); distortImage(height, width, pic); pic.Save(stream, ImageFormat.Png); return stream.ToArray(); })); }