22 Eylül 2013 Pazar

C# da Resim Doğrulama Kodunu Atlatmak

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.
İşlemlere başlamadan önce de OCR kavramına biraz bakmak da önemli.Buradaki linkten http://office.microsoft.com/tr-tr/help/HP003081255.aspx nasıl bir şey olduğu ile ilgili kafanızda birşeyler belirebilir.

Resim doğrulama kodu için ben 3 aşamalı bir uygulama geliştirdim ve bunlar
  1. C# Webbrowser nesnesi ile resmi download etmek.
  2. Resmi yeniden renklendirmek
  3. 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.




17 Temmuz 2013 Çarşamba

C# Entity Framework Stored Procedure Kullanılamaması.

Merhaba arkadaşlar bu yazımda karşılaştığım ve bana gereksiz yere zaman harcatan bir hatadan bahsedicem. Aslında tam olarak da hata diyemiceğim bir durum bu ...  EF ile çalışırken bazen  (her eklediğimde karşılaşmadım.) store proc ekleme işlemii yaptığımda intellisense da SP mi göremiyor ve onu kullanmıyorum.Bunun çeşitli nedenleri olabilir ama benim sorunumda Model Browser'dan baktığımda SP nin Comlex Type ı eklenmiş ve Function Import Bölümünde Fuctionunun eklenmiş olduğu halde SP mi kullanamıyordum.Bunu aşmak için ve çalışmaya devam etmek için Solition Explorerdan Modelinize gelin ve Model.Context.tt ve Model.tt üzerine ayrı ayrı sağ tıklayarak run costom tool seçeneğini seçin.Bunu yaptıktan sonra spnizi sorunsuz olarak kullanmaya devam edebilirsiniz.
Not: Benim Örneğimde Nortwind kullanıdığı için oradaki isimler NorthwindModel.Contenxt.tt ve NorthwindModel.tt dir.
Yardımcı olduysa iyi :)

20 Mayıs 2013 Pazartesi

C# Duplicate initialization of member Hatası

Merhaba arkadaşlar. Çalışmanızda bu hatayı bir objenizn propertysine değer ataması işlemi yapıyorsanız görebilirsiniz bunun nedeni zaten objenin o properysine değer atamış olmanızdır.Örnek olarak ;

var kisi = new kisiObje
{
      ID = 1,
      Yas = 18,
      Ad = "Ali",
      Soyad = "Cankan",
      Yas = 21
};

Bu atama işeleminde 2. Yas ataması bölümünde hata olduğunu visual studio bize bildiricek yapmamız gereken atamalarımı kontrol etmek.

14 Mayıs 2013 Salı

Asp.net Garip Url

Merhaba arkadaşlar çalıştığınız bir asp.net sayfası üzerinde webconfig ayarlarında session ayarları yaptığınız zaman karşınıza bu tarz bir url çıkabilir.

http://localhost:35735/(S(gj33dkv0arq3snrxavpze3vs))/sayfam


Örnek vericek olursam;

<sessionState
     mode="InProc"
     cookieless="true"
     timeout="30"/>

Bu url tipinden kurtulmak ve eski haline çevirmek için. Buradaki  cookieless="true" kısmını kaldırmak yeterli olucaktır