/// <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);
        }
Exemple #2
0
        /// <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);
        }