Merhaba arkadaşlar bu yazımda bast resim doğrulama kodlarını nasıl çözüceğimizi ve atlatıcağımızı anlatıcam. Öncelikle şu anda atlatılabilecek tarzda olan kod örneği vermek istiyorum.
Resimde gördüğünüz kod basit denecek bir resim ve renklerin çözümlenmesi çok kolay.
Resim doğrulama kodu için ben 3 aşamalı bir uygulama geliştirdim ve bunlar
- C# Webbrowser nesnesi ile resmi download etmek.
- Resmi yeniden renklendirmek
- OCR ile resim üzerinden okuma işlemini yapmak
Şimdi adımları açılayarak neden gerekli ve nasıl işlediğini görücez arkadaşlar.
1.C# Webbrowser nesnesi ile resmi download etmek.
Bu işlemi resim üzerinde oynama yapabilmek için yapıyoruz webbrowserda açılan sayfadaki resim doğrulama kodunu (captchayı) indirme işlemi ile başlıyoruz.
public void GetCaptcha(string URL)
{
IHTMLDocument2 wbDocument = (IHTMLDocument2)Browser4A4B.Document.DomDocument;
IHTMLControlRange imageRange = (IHTMLControlRange)((HTMLBody)wbDocument.body).createControlRange();
foreach (IHTMLImgElement img in wbDocument.images)
{
imageRange.add((IHTMLControlElement)img);
imageRange.execCommand("Copy", false, null);
using (Bitmap bmp = (Bitmap)Clipboard.GetDataObject().GetData(DataFormats.Bitmap))
{
bmp.Save(string.Format("{0}\\guvenlikResmi.bmp", Application.StartupPath));
}
}
}
Yukarıdaki örnek kod bize resmi getiriyor ve programın çalıştığı dizine resmi kaydediyor. İlk adımımızı böyle sonlandırıyoruz.
2.Resmi yeniden renklendirmek
Bu bölümde daha önceden resmi siyah beyaz yapma işlemi ile ilgili makalemdeki kodlardan faydalandım aslında.tek fark birazcık değişiklik yaptım üzerinde.
private string GunvenlikKoduDuzenle(string resimYolu)
{
try
{
bmp = new Bitmap(resimYolu);
for (int y = 0; y < bmp.Height; y++)
{
for (int x = 0; x < bmp.Width;
x++)
{
Color eski = bmp.GetPixel(x, y);
int ortalama = (eski.R + eski.G
+ eski.B) / 3;
Color yeni = eski;
if (ortalama <= 50)
yeni = Color.White;
else
yeni = eski;
bmp.SetPixel(x, y,
yeni);
}
for (int x = 0; x < bmp.Width;
x++)
{
Color eski = bmp.GetPixel(x, y);
int ortalama = (eski.R + eski.G
+ eski.B) / 3;
Color yeni = Color.White;
if (ortalama != 255)
yeni = Color.Black;
bmp.SetPixel(x, y,
yeni);
}
}
pictureBox2.Image = bmp;
bmp.Save(resimYolu.Replace(".bmp", string.Empty) + "Temiz.bmp");
return resimYolu.Replace(".bmp", string.Empty) + "Temiz.bmp";
}
catch
{
return string.Empty;
}
}
Bu bölümde dikkat etmemiz gereken 2 bölüm var.1. bölüm ilk for döngüsü için geçerli bu bölümde pixel pixel tarama var ve pixelin RGB değerini alıp ortalamasını buluyor.Bu ortalama ile de pixelin siyaha yakın olma durumunu anlıyoruz ve siyah renkteki arka planı beyaz yapıyoruz.2. bölümü ise geri kalan yazı kısmını birden fazla renk olduğu için tek renk siyaha çevirme işlemi. Bu işlemleri yapma amacımsa OCR için daha net ve basit bir resim oluşturmak. Çünkü bu yöntemi kullansam da OCR ile %100 çevirme işlemi olamayabiliyor.
3.OCR ile resim üzerinden okuma işlemini yapmak
MODI.Document modiDocument;
private string GuvenlikResmiIceriginiAl(string dosyaYolu)
{
try
{
modiDocument.Create dosyaYolu);
modiDocument.OCR(MODI.MiLANGUAGES.miLANG_ENGLISH, true, true);
foreach (MODI.Image insImage in modiDocument.Images)
{
MODI.Layout insLayout =
insImage.Layout;
return insLayout.Text;
}
modiDocument.Close(false);
return string.Empty;
}
catch (Exception ex)
{
SystemStatics.HataYakala(ex);
return string.Empty;
}
}
Son bölümde ise oluşturduğum resmi Office içinde olan OCR yi kullanarak. Çıkan sonucu return ederek alıyorum. Burdaki unutulmaması gereken bir husus da MODI referansını projeye eklemek.
Bu yöntem ile bu tarzdaki resimleri %75 oranında çözümleyebiliyorum. Umarım sizin de işinize yarar. Okuduğunuz için teşekkürler.