/// <summary> /// 获取指定字符串的验证码图片 /// </summary> /// <param name="code">验证码</param> /// <returns></returns> public Bitmap CreateImage(string code) { code.CheckNotNullOrEmpty(nameof(code)); var width = FontWidth * code.Length + FontWidth; var height = FontSize + FontSize / 2; const int flag = 255 / 2; bool isBgLight = (Background.R + Background.G + Background.B) / 3 > flag; Bitmap image = new Bitmap(width, height); Graphics graphics = Graphics.FromImage(image); graphics.Clear(Background); Brush brush = new SolidBrush(Color.FromArgb(255 - Background.R, 255 - Background.G, 255 - Background.B)); int x, y = 3; if (HasBorder) { graphics.DrawRectangle(new Pen(Color.Silver), 0, 0, image.Width - 1, image.Height - 1); } Random rnd = Random; // 绘制干扰线 for (var i = 0; i < RandomLineCount; i++) { x = rnd.Next(image.Width); y = rnd.Next(image.Height); int m = rnd.Next(image.Width); int n = rnd.Next(image.Height); Color lineColor = !RandomColor ? Color.FromArgb(90, 90, 90) : isBgLight ? Color.FromArgb(rnd.Next(130, 200), rnd.Next(130, 200), rnd.Next(130, 200)) : Color.FromArgb(rnd.Next(70, 150), rnd.Next(70, 150), rnd.Next(70, 150)); Pen pen = new Pen(lineColor, 2); graphics.DrawLine(pen, x, y, m, n); } // 绘制干扰点 for (var i = 0; i < (int)(image.Width * image.Height * RandomPointPercent / 100); i++) { x = rnd.Next(image.Width); y = rnd.Next(image.Height); Color pointColor = isBgLight ? Color.FromArgb(rnd.Next(30, 80), rnd.Next(30, 80), rnd.Next(30, 80)) : Color.FromArgb(rnd.Next(150, 200), rnd.Next(150, 200), rnd.Next(150, 200)); image.SetPixel(x, y, pointColor); } // 绘制文字 for (var i = 0; i < code.Length; i++) { rnd = Random; x = FontWidth / 4 + FontWidth * i; if (RandomPosition) { x = rnd.Next(FontWidth / 4) + FontWidth * i; y = rnd.Next(image.Flags / 5); } PointF point = new PointF(x, y); if (RandomColor) { int r, g, b; if (!isBgLight) { r = rnd.Next(255 - Background.R); g = rnd.Next(255 - Background.G); b = rnd.Next(255 - Background.B); if ((r + g + b) / 3 < flag) { r = 255 - r; g = 255 - g; b = 255 - b; } } else { r = rnd.Next(Background.R); g = rnd.Next(Background.G); b = rnd.Next(Background.B); if ((r + g + b) / 3 > flag) { r = 255 - r; g = 255 - g; b = 255 - b; } } brush = new SolidBrush(Color.FromArgb(r, g, b)); } var fontName = Valid.IsContainsChinese(code) ? FontNamesForChinese[rnd.Next(FontNamesForChinese.Count)] : FontNames[rnd.Next(FontNames.Count)]; var font = new Font(fontName, FontSize, FontStyle.Bold); if (RandomItalic) { graphics.TranslateTransform(0, 0); Matrix transform = graphics.Transform; transform.Shear(Convert.ToSingle(rnd.Next(2, 9) / 10d - 0.5), 0.001f); graphics.Transform = transform; } graphics.DrawString(code.Substring(i, 1), font, brush, point); graphics.ResetTransform(); } return(image); }
/// <summary> /// 获取汉字的全拼,范例:中国,返回zhongguo /// </summary> /// <param name="text">汉字文本,范例:中国</param> /// <returns></returns> public static string ConvertPinYin(string text) { byte[] arr = new byte[2]; string pyStr = ""; int asc = 0, M1 = 0, M2 = 0; char[] mChar = text.ToCharArray();//获取汉字对应的字符数组 for (int i = 0; i < mChar.Length; i++) { //如果输入的是汉字 if (Valid.IsContainsChinese(mChar[i].ToString())) { arr = Encoding.Default.GetBytes(mChar[i].ToString()); M1 = (short)(arr[0]); M2 = (short)(arr[1]); asc = M1 * 256 + M2 - 65536; if (asc > 0 && asc < 160) { pyStr += mChar[i]; } else { switch (asc) { case -9254: pyStr += "Zhen"; break; case -8985: pyStr += "Qian"; break; case -5463: pyStr += "Jia"; break; case -8274: pyStr += "Ge"; break; case -5448: pyStr += "Ga"; break; case -5447: pyStr += "La"; break; case -4649: pyStr += "Chen"; break; case -5436: pyStr += "Mao"; break; case -5213: pyStr += "Mao"; break; case -3597: pyStr += "Die"; break; case -5659: pyStr += "Tian"; break; default: for (int j = (Const.SpellCode.Length - 1); j >= 0; j--) { if (Const.SpellCode[j] <= asc) { //判断汉字的拼音区编码是否在指定范围内 pyStr += Const.SpellLetter[j]; //如果不超出范围则获取对应的拼音 break; } } break; } } } else { //如果不是汉字则返回 pyStr += mChar[i].ToString(); } } return(pyStr); }