• 0 Oy - 0 Ortalama
  • 1
  • 2
  • 3
  • 4
  • 5
c# captcha yapımı

 
#1

Arama motorlarında Graphics sınıfını kullanılarak Captcha yapımı hakkında Türkçe olarak yayınlanmış konu çok az gördüm. Kaynaklık olması açısından detaylı bir şekilde örnek Captcha uygulamaları yapmaya çalışacağız. Maksat insanların kaynaklık açısından sıkıntı çekmemesi.
 
Daha ileri düzey Captcha yapmak istiyorsak System.Drawing namespace'sinde yer alan Graphics sınıfını kullanmamız gerekecek.
 
Peki bu Graphics sınıfı ne yapar, ne işe yarar? Graphics sınıfı, basit düzeyde grafiksel işlemler yapmayı sağlar. Yani Form üzerine yazı ve grafik çizimi ve aynı zamanda bu çizimlere uygulanacak temel seviyede efektlerin yapılmasını sağlar da diyebiliriz.
 
Biz Graphics sınıfının DrawString() metodu ile Form zemini üzerinde Captcha için gerekli olan kodları yazdırıcaz. FillRectangle() metodu ile de Form zemini üzerine bir dikdörtgen çizdirip bu dikdörtgenin içini bu metot sayesinde çeşitli Brush sınıflarını kullanarak daha güzel efektler, şekiller vermeye çalışıcaz.
 
Hemen bir küçük örnek yapalım.
 
Form üzerine Captcha yapacağımız için Form'un Paint adlı event'ini kullanıcaz. Paint eventi, Form üzerine grafiksel işlemler yapılmasını sağlatan bir event'tir diyebiliriz. Load event'ini kullanarak yapamayız onu da belirteyeyim. Mesela panel üzerinde bir Captcha yapacaksak panel'in Paint event'ini yine kullanmamız gerekecek.
 
Grafik oluşturmak için ise Form'un CreateGraphics() metodunu mutlaka kullanmamız gerekecek ilk önce. Bu metot bazı kontrollerde (ÖRN: panel) bulunmaz. Ama ne demiştik? Mutlaka bir CreateGraphics oluşturmamız gerek demi. Bu metodun yerine kontrolün Paint event'inde
ki "PaintventArgs e"  gibi olay kontrolünün parametresinin e.Graphics property'sini kullanıcaz.
 
2. örneğin Proje dosyasını inceleyebilirsiniz : Captcha.zip
 
ÖRN:              
using System.Drawing;
using System.Drawing.2D;

       private void Form1_Paint(object sender, PaintEventArgs e) //Form'un Paint event'ini kullanıyoruz Form üzerinde grafik işlemleri yapmak için. Load event'ini kullanmıyoruz. Bu kısma dikkat edelim.
       {
           Graphics grp = this.CreateGraphics(); // İlk önce Form'un üzerine bir grafik çizdirmek için bir nesne ürettik Form'un CreateGraphics() metodu ile.
           grp
.SmoothingMode = SmoothingMode.AntiAlias; //Form üzerinde çizgiler üzerindeki bazı bozulmaları engellemek için bu satırı yazdık. İlla şart değil ama daha hoş görüntü için yazsak daha iyi olur. Böylece bozuk görüntülerden kurtulmuş oluruz.

           //Dikdörtgen oluşturmak için gerekli kodlarımızı yazıyoruz.
           HatchBrush hB = new HatchBrush(HatchStyle.ZigZag, Color.WhiteSmoke, Color.DimGray); //Oluşturacağımız dikdörtgenin sitilini HatchBrush sınıfını kullanarak yaptık burada da . İlk önce stilini belirttik, sonra foreColor'unu sonra da backColor'unu.
         
           Rectangle rct = new Rectangle(162, 25, 120, 32); //İçi dolu olacak olan dikdörtgenin nerede oluşturulacağını belirtiyoruz burada (Location(x,) ve Size(width,height) .

           grp
.FillRectangle(hB, rct); //Daha sonrada FillRectangle metodunu kullanarak Brush ve Rectangle parametrelerini belirtiyoruz. Yukarıda oluşturmuştuk zaten. Parametre olarak da bunları verdik.


           //Şimdi de oluşturduğumuz dikdörtgenin içerisine yazılacak CAPTCHA kodumuzu tanımlatmak için gerekli kodlarımızı yazıyoruz.
           Font drawFont = new Font("Comic Sans MS", 20, FontStyle.Bold, GraphicsUnit.Point); //CAPTCHA kodumuzun font ayarlamalarını yapıyoruz.
           SolidBrush drawBrush = new SolidBrush(Color.White); //CAPTCHA kodumuzun rengini ayarlıyoruz.

           grp
.DrawString("X78jP6", drawFont, drawBrush, 171, 21); //CAPTCH kodumuzun nereye yazılacağını belirtiyoruz. Daha önce oluşturduğumuz dikdörtgenin içerisine yazdıracaz CAPTCHA kodunu. Bu yüzden dikdörtgenin içini yazdırılacak şekilde Location(x,y) 'unu belirttik. Dikdörtgenin Location(x,y) 'una yakın olmasına özen gösterelim. Yoksa düzenli görüntü ortaya çıkmaz.


           //Nesnelerimizi bellekten çıkartıyoruz. GB (Garbage Collector) devreye girer ama biz yine de işimizi temiz yapalım. Smile
           grp
.Dispose();
           hB
.Dispose();
           drawFont
.Dispose();
           drawBrush
.Dispose();
       }

 
Ekran Çıktısı:  [Resim: 1.png.96cf0df9f08ca7e3e3e2149fdcbde01b.png]
 
Yukarıdaki örnekte CAPTCHA kodumuzu biz Random sınıfını kullanarak rastgele belirtmeyip elimizle girdik kısa örnek olsun diye. Ama Random sınıfını kullanarak da yapabilriz yani.
 
İlk önce yukarıdaki örneği bir inceleyelim: HatchBrush sınıfını kullanarak içi dolu olarak oluşturacağımız dikdörtgenin stilini, foreColor'unu ve backColor'unu tanımlattırdık.
 
İlla HatchBrush sınıfını kullanarak aynı stili yapmayabiliriz. Birden fazla sınıf var. Örneğin; LinearGradientBrust, PathGradientBrush sınıfları bunlara örnek verilebilir. Stil olarak ZigZag enum'unu belirttik ama çok sayıda stil örneği vardır. Bunlar aşağıdaki gibidir:
 
                                                      [Resim: 2.png.e55ef476ce486befc476e2f729c61751.png]
 
Yukarıdaki stillerden göz zevkimize göre herhangi birini de seçebiliriz yani. Örneğin aşağıdaki gibi;
 
                                      [Resim: 3.png.0285b4b7eae90a1d1eb2bf1a88d2a8e7.png]
 
 
Şimdi de Random sınıfını kullanarak bir örnek yapalım.
 
ÖRN:                      
using System.Drawing;
using System.Drawing.2D;

       Random rnd;
       int[] sayilar;
       string g
üvenlikKodu, yenilenenGüvenlikKodu;

       private void Form1_Load(object sender, EventArgs e)
       {
           sayilar
= new int[6]; //6 karakterli bir CAPTCH yapacağız.

           rnd
= new Random();

           for (int i = 0; i < 6; i++)
           {
               sayilar
[i] = rnd.Next(0, 9);
           }

           g
üvenlikKodu = sayilar[0].ToString() + sayilar[1].ToString() + sayilar[2].ToString() + sayilar[3].ToString() + sayilar[4].ToString() + sayilar[5].ToString();


       }
       private void Form1_Paint(object sender, PaintEventArgs e) //Form'un Paint event'ini kullanıyoruz Form üzerinde grafik işlemleri yapmak için. Load event'ini kullanmıyoruz. Bu kısma dikkat edelim.
       {
           Graphics grp = this.CreateGraphics(); // İlk önce Form'un üzerine bir grafik çizdirmek için bir nesne ürettik Form'un CreateGraphics() metodu ile.
           grp
.SmoothingMode = SmoothingMode.AntiAlias; //Form üzerinde çizgiler üzerindeki bazı bozulmaları engellemek için bu satırı yazdık. İlla şart değil ama daha hoş görüntü için yazsak daha iyi olur. Böylece bozuk görüntülerden kurtulmuş oluruz.

           //Dikdörtgen oluşturmak için gerekli kodlarımızı yazıyoruz.
         

           Rectangle rct = new Rectangle(162, 25, 120, 32); //İçi dolu olacak olan dikdörtgenin nerede oluşturulacağını belirtiyoruz burada (Location(x,) ve Size(width,height) .

           LinearGradientBrush hB = new LinearGradientBrush(rct, Color.Red, Color.DeepSkyBlue, LinearGradientMode.ForwardDiagonal); //Oluşturacağımız dikdörtgenin stilini LinearGradientBrush sınıfını kullanarak yaptık burada da .

           grp
.FillRectangle(hB, rct); //Daha sonrada FillRectangle metodunu kullanarak Brush ve Rectangle parametrelerini belirtiyoruz. Yukarıda oluşturmuştuk zaten. Parametre olarak da bunları verdik.


           //Şimdi de oluşturduğumuz dikdörtgenin içerisine yazılacak CAPTCHA kodumuzu tanımlatmak için gerekli kodlarımızı yazıyoruz.
           Font drawFont = new Font("Comic Sans MS", 19, FontStyle.Bold, GraphicsUnit.Point); //CAPTCHA kodumuzun font ayarlamalarını yapıyoruz.
           SolidBrush drawBrush = new SolidBrush(Color.White); //CAPTCHA kodumuzun rengini ayarlıyoruz.

           grp
.DrawString(güvenlikKodu, drawFont, drawBrush, 171, 21); //CAPTCH kodumuzun nereye yazılacağını belirtiyoruz. Daha önce oluşturduğumuz dikdörtgenin içerisine yazdıracaz CAPTCHA kodunu. Bu yüzden dikdörtgenin içini yazdırılacak şekilde Location(x,y) 'unu belirttik. Dikdörtgenin Location(x,y) 'una yakın olmasına özen gösterelim. Yoksa düzenli görüntü ortaya çıkmaz.


           //Nesnelerimizi bellekten çıkartıyoruz. GB (Garbage Collector) devreye girer ama biz yine de işimizi temiz yapalım. Smile
           grp
.Dispose();
           hB
.Dispose();
           drawFont
.Dispose();
           drawBrush
.Dispose();
       }  

       private void btnGüvenlikKoduYenile_Click(object sender, EventArgs e)
       {
           txtG
üvenlikKodu.Clear();

           sayilar
= new int[6];

           rnd
= new Random();

           for (int i = 0; i < 6; i++)
           {
               sayilar
[i] = rnd.Next(0, 9);
           }

           yenilenenG
üvenlikKodu = sayilar[0].ToString() + sayilar[1].ToString() + sayilar[2].ToString() + sayilar[3].ToString() + sayilar[4].ToString() + sayilar[5].ToString();


           Graphics grp = this.CreateGraphics(); // İlk önce Form'un üzerine bir grafik çizdirmek için bir nesne ürettik Form'un CreateGraphics() metodu ile.
           grp
.SmoothingMode = SmoothingMode.AntiAlias; //Form üzerinde çizgiler üzerindeki bazı bozulmaları engellemek için bu satırı yazdık. İlla şart değil ama daha hoş görüntü için yazsak daha iyi olur. Böylece bozuk görüntülerden kurtulmuş oluruz.

           //Dikdörtgen oluşturmak için gerekli kodlarımızı yazıyoruz.

           grp
.Clear(Color.White);

           Rectangle rct = new Rectangle(162, 25, 120, 32); //İçi dolu olacak olan dikdörtgenin nerede oluşturulacağını belirtiyoruz burada (Location(x,) ve Size(width,height) .

           LinearGradientBrush hB = new LinearGradientBrush(rct, Color.Red, Color.DeepSkyBlue, LinearGradientMode.ForwardDiagonal); //Oluşturacağımız dikdörtgenin stilini LinearGradientBrush sınıfını kullanarak yaptık burada da .

           grp
.FillRectangle(hB, rct); //Daha sonrada FillRectangle metodunu kullanarak Brush ve Rectangle parametrelerini belirtiyoruz. Yukarıda oluşturmuştuk zaten. Parametre olarak da bunları verdik.


           //Şimdi de oluşturduğumuz dikdörtgenin içerisine yazılacak CAPTCHA kodumuzu tanımlatmak için gerekli kodlarımızı yazıyoruz.
           Font drawFont = new Font("Comic Sans MS", 19, FontStyle.Bold, GraphicsUnit.Point); //CAPTCHA kodumuzun font ayarlamalarını yapıyoruz.
           SolidBrush drawBrush = new SolidBrush(Color.White); //CAPTCHA kodumuzun rengini ayarlıyoruz.

           grp
.DrawString(yenilenenGüvenlikKodu, drawFont, drawBrush, 171, 21); //CAPTCH kodumuzun nereye yazılacağını belirtiyoruz. Daha önce oluşturduğumuz dikdörtgenin içerisine yazdıracaz CAPTCHA kodunu. Bu yüzden dikdörtgenin içini yazdırılacak şekilde Location(x,y) 'unu belirttik. Dikdörtgenin Location(x,y) 'una yakın olmasına özen gösterelim. Yoksa düzenli görüntü ortaya çıkmaz.


           //Nesnelerimizi bellekten çıkartıyoruz. GB (Garbage Collector) devreye girer ama biz yine de işimizi temiz yapalım. Smile
           grp
.Dispose();
           hB
.Dispose();
           drawFont
.Dispose();
           drawBrush
.Dispose();

       }

       private void btnKontrolEt_Click(object sender, EventArgs e)
       {
           if (güvenlikKodu == txtGüvenlikKodu.Text)
               MessageBox.Show("Doğru CAPTCHA girildi.","Bilgilendidrme",MessageBoxButtons.OK,MessageBoxIcon.Information);
           else if (yenilenenGüvenlikKodu == txtGüvenlikKodu.Text)
               MessageBox.Show("Doğru CAPTCHA girildi.", "Bilgilendidrme", MessageBoxButtons.OK, MessageBoxIcon.Information);
           else
           {
               MessageBox.Show("Yanlış CAPTCHA girildi.", "Bilgilendidrme", MessageBoxButtons.OK, MessageBoxIcon.Warning);
               txtG
üvenlikKodu.Clear();
           }

       }

 
Ekran Çıktısı:  [Resim: 4.png.3fc03b809fd95ecc15b142f9cc1a0ad5.png]
 
Yukarıdaki örnekte ise Random sınıfını kullanarak bir örnek yaptık. Brush stili olarak ise bu kez de LinearGradientBrush sınıfını kullandık.
 
Bu örneğin dosyalarını yukarıda paylaştım. Oradan daha net şekilde inceleyebilirsiniz.



Bul
Alıntı


Digg   Delicious   Reddit   Facebook   Twitter   StumbleUpon  


Bu konuyu görüntüleyen kullanıcı(lar):
1 Ziyaretçi

   
Türkçe Çeviri: Emre KRMN, Kodlayanlar MyBB, © 2002-2024 MyBB Group.  



Merih Forum® bilgi paylaşım platformu. 2015-∞ Tüm hakları saklıdır.