Skocz do zawartości
  • 👋 Witaj na MPCForum!

    Przeglądasz forum jako gość, co oznacza, że wiele świetnych funkcji jest jeszcze przed Tobą! 😎

    • Pełny dostęp do działów i ukrytych treści
    • Możliwość pisania i odpowiadania w tematach
    • System prywatnych wiadomości
    • Zbieranie reputacji i rozwijanie swojego profilu
    • Członkostwo w jednej z największych społeczności graczy

    👉 Dołączenie zajmie Ci mniej niż minutę – a zyskasz znacznie więcej!

    Zarejestruj się teraz

[Tutorial] Dowolny obrazek ze strony do bitmapu + OCR


Rekomendowane odpowiedzi

Opublikowano

W tym emm, gotowcu, przedstawię wam jak wyciągnąć dowolny obrazek ze strony www

 

Potrzebujemy 

 - VS

 - Mózg

 

Zaczynamy 

 

Tworzymy sobie winforme, importujemy do niej Microsoft.mshtml który wyciągnie nasz obrazek. Do formy dodajemy 1 button oraz 1 picturebox oraz 1 webbrowser

 

Teraz przechodzimy na naszą strone, na obrazek który chcemy uzyskać klikamy i wybieramy zbadaj element

 

W imgsrc szukamy tego, co obrazek będzie zawierał. Jeśli to captcha, pomimo zmiennych obrazków w src będzie powtarzać się słowo captcha (dla zobrazowania screen poniżej) 

x0llii.jpg

 

Dobra, do roboty. Tworzy sobie Sub, a pod nim dodajemy :

 
Dim doc As mshtml.IHTMLDocument2 = WebBrowser1.Document.DomDocument
        Dim imgrange As mshtml.IHTMLControlRange = CType(doc.body, mshtml.HTMLBody).createControlRange
        For Each img As mshtml.IHTMLControlElement In doc.images
            If img.getattribute("src").ToString.Contains("XXX") Then   ' xxx wypierdol i wstaw to co obrazek zawiera w imgsrc
                imgrange.add(img)                                                                       'dodatkowo zapis uzyskiwania captchy jako funkcja
                imgrange.execCommand("Copy", False, Nothing)
                Picturebox1.Image = Clipboard.GetDataObject.GetData(DataFormats.Bitmap)
                Exit For
            End If
        Next

Tak będzie wyglądało pobranie captchy ;

wuc71x.jpg

 

To by było na tyle. Jesli obrazek jest prosty, może będziemy w stanie go odczytać za pomocą tessnetu2

 

 - Ściągamy tessnet2, i dodajemy jako referencję.

 - Do sciezki naszego pliku exe czyli pewnie debug, wrzucamy tessdata(pobierze nam sie razem z tessnetem2)

 - Tyle, aby rozpoznać wrzucamy kod(już przygotowany poprzez mnie do natychmiastowego uzytku)

 Dim ocr As New tessnet2.Tesseract()
        Dim captchaimage As New Bitmap(Picturebox1.Image())
 
 
        ocr.Init(Application.StartupPath & "\tessdata", "eng", False)
        Dim result As List(Of tessnet2.Word) = ocr.DoOCR(captchaimage, Rectangle.Empty)
        For Each word As tessnet2.Word In result
            RichTextBox1.Text = word.Text
        Next

    Po tym wszystkim oczywiscie  wypierdoli nam błąd. Aby go naprawic przechodzimy do ustawien konfiguracyjynch i podmieniamy na to :

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
  <startup useLegacyV2RuntimeActivationPolicy="true">
    <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5" />
  </startup>
</configuration>

    Ewentualnie gdy ktoś chciałby sobie zapisać ten uzyskany obrazek,można do buttona dodać ten kod

PictureBox1.Image.Save("C:\NewFileName.jpg", System.Drawing.Imaging.ImageFormat.Jpeg)

     Żeby różne obrazki były lepiej rozpoznawane poprzez tessnet2,  zaleca się użycie tej funkcji(powiększenie obrazka 200%, kod nie jest mój)

     Wymaga importu System.drawing.drawin2d

 Public Function GenerateThumbnail(ByVal original As Image, ByVal percentage As Integer) As Image
        Dim image As New Bitmap(Picturebox1.Image)
        If percentage < 1 Then
            Throw New Exception("Thumbnail size must be aat least 1% of the original size")
        End If
        Dim tn As New Bitmap(CInt(original.Width * 0.01F * percentage), CInt(original.Height * 0.01F * percentage))
        Dim g As Graphics = Graphics.FromImage(tn)
        g.InterpolationMode = InterpolationMode.HighQualityBilinear
        'experiment with this...
        g.DrawImage(original, New Rectangle(0, 0, tn.Width, tn.Height), 0, 0, original.Width, original.Height, _
         GraphicsUnit.Pixel)
        g.Dispose()
        Return DirectCast(tn, Image)
    End Function

     Różne tessdaty odpowiadające różnym językom można sciągnąć na ich oficjalnej stronie(google it). 

     Typowo użyłem tej z zestawu dla "eng", czyli angielskiego. W kodzie możemy sobie to zmienić  

       ## LINKI

 

   - http://www.pixel-technology.com/freeware/tessnet2/ - Link do tessnetu, naszej dllki. W zestawie załączono tessdate dla języka angieslkiego,wstawiam ją tam gdzie nasz .exe

   - https://signup.leagueoflegends.com/pl/signup - Strona z której pobrałem captche

   - http://pastebin.com/BPahFbbA - kod do skopiowania na uzyskiwanie obrazku

   - http://pastebin.com/KniSqwUR - kod do skopiowania na OCR tessnetu2

   - http://pastebin.com/ZP5fvDMN - kod do skopiowania na powiększenie obrazka

Zarchiwizowany

Ten temat przebywa obecnie w archiwum. Dodawanie nowych odpowiedzi zostało zablokowane.

×
×
  • Dodaj nową pozycję...