Создание CAPCHA для Windows Form приложений

      Все замечали при регистрации или создании сообщения на форумах или обычных сайтах, везде присутствует картинка с искаженным текстом, которую обычно долго рассматриваешь, пытаясь понять, что там написано. Имя ей CAPTCHA. CAPTCHA от англ. Completely Automated Public Turing test to tell Computers and Humans Apart — полностью автоматизированный публичный тест Тьюринга для различия компьютеров и людей. В интернете часто транскрибируется как «капча».       Термин появился в 2000 году. Основная идея теста: предложить пользователю такую задачу, которую с лёгкостью может решить человек, но которую несоизмеримо сложнее решить компьютеру. В данном посте мы рассмотрим создание изображения с помехами или Капчу.
Создайте проект Windows Form и добавьте три компонента на форму:
  • pictureBox1 - будет отвечать за прорисовку капчи.
  • Свойство: Size = 169; 63;
  • textBox1 -нужен для ввода пользователем ответа
  • button1 - кнопка для генерации новой капчи.
  • Свойство: Text = Обновить;
  • button2 - кнопка проверки введенных данных
  • Свойство: Text = OK; 
    После добавления компонентов ваша форма примет приведенный ниже вид:
Перейдите в код формы и добавьте следующий метод:
private Bitmap CreateImage(int Width, int Height)
{
    Random rnd = new Random();

    //Создадим изображение
    Bitmap result = new Bitmap(Width, Height);

    //Вычислим позицию текста
    int Xpos = 10;
    int Ypos = 10;

    //Добавим различные цвета ддя текста
    Brush[] colors = {
             Brushes.Black,
             Brushes.Red,
             Brushes.RoyalBlue,
             Brushes.Green,
             Brushes.Yellow,
             Brushes.White, 
             Brushes.Tomato,
             Brushes.Sienna,
             Brushes.Pink };

    //Добавим различные цвета линий
    Pen[] colorpens = {
             Pens.Black,
             Pens.Red,
             Pens.RoyalBlue,
             Pens.Green,
             Pens.Yellow,
             Pens.White, 
             Pens.Tomato,
             Pens.Sienna,
             Pens.Pink };

    //Делаем случайный стиль текста
    FontStyle[] fontstyle = {
             FontStyle.Bold,
             FontStyle.Italic,
             FontStyle.Regular,
             FontStyle.Strikeout,
             FontStyle.Underline};

    //Добавим различные углы поворота текста
    Int16[] rotate = {1,-1,2,-2,3,-3,4,-4,5,-5,6,-6};

    //Укажем где рисовать
    Graphics g = Graphics.FromImage((Image)result);

    //Пусть фон картинки будет серым
    g.Clear(Color.Gray);            

    //Делаем случайный угол поворота текста
    g.RotateTransform(rnd.Next(rotate.Length));

    //Генерируем текст
    text = String.Empty;
    string ALF = "1234567890QWERTYUIOPASDFGHJKLZXCVBNM";
    for (int i = 0; i < 5; ++i)
        text += ALF[rnd.Next(ALF.Length)];

    //Нарисуем сгенирируемый текст
    g.DrawString(text,
                 new Font("Arial", 25, fontstyle[rnd.Next(fontstyle.Length)]),
                 colors[rnd.Next(colors.Length)],
                 new PointF(Xpos, Ypos));

    //Добавим немного помех
    //Линии из углов
    g.DrawLine(colorpens[rnd.Next(colorpens.Length)],
               new Point(0, 0),
               new Point(Width - 1, Height - 1));
    g.DrawLine(colorpens[rnd.Next(colorpens.Length)],
               new Point(0, Height - 1),
               new Point(Width - 1, 0));

    //Белые точки
    for (int i = 0; i < Width; ++i)
        for (int j = 0; j < Height; ++j)
            if (rnd.Next() % 20 == 0)
                result.SetPixel(i, j, Color.White);

    return result;
}
В событие Click кнопки button1 добавим метод для генерации новой капчи:
private void button1_Click(object sender, EventArgs e)
{
    pictureBox1.Image = this.CreateImage(pictureBox1.Width, pictureBox1.Height);
}
В событие Click кнопки button2 добавим метод выполняющий проверку введенного текста и сгенерированного:
private void button2_Click(object sender, EventArgs e)
{
    if (textBox1.Text == this.text)
        MessageBox.Show("Верно!");
    else
        MessageBox.Show("Ошибка!");
}
В событие Form1_Load, запуск которого происходит при загрузке проекта, так же добавим генерацию капчи.
private void Form1_Load(object sender, EventArgs e)
{
    pictureBox1.Image = this.CreateImage(pictureBox1.Width, pictureBox1.Height);    
}
Запустите проект и проверьте работу созданного проекта. Примеры работы проекта смотрите ниже.

Ссылка для скачивания примера: Яндекс.Диск


Комментариев нет:

Отправить комментарий

Большая просьба, не писать в комментариях всякую ерунду не по теме!