Porovnání dvou obrázků   zodpovězená otázka

VB.NET, WinForms

Dobrý den,

Udělal jsem porovnávání dvou obrázku

  Dim bmpa As New Bitmap(PictureBox1.Image)
        Dim bmpb As New Bitmap(PictureBox2.Image)
        Dim JeToOk As Integer = 0
        Dim NeniOk As Integer = 1
        ' obrazek ma velikost 30
        For Y = 1 To 30
            For X = 1 To 30
                Dim G1 As Integer = bmpa.GetPixel(X, Y).G
                Dim R1 As Integer = bmpa.GetPixel(X, Y).R
                Dim B1 As Integer = bmpa.GetPixel(X, Y).B
                Dim G2 As Integer = bmpb.GetPixel(X, Y).G
                Dim R2 As Integer = bmpb.GetPixel(X, Y).R
                Dim B2 As Integer = bmpb.GetPixel(X, Y).B
                If G1 = G2 And R1 = R2 And B1 = B2 And NeniOk = 1 Then
                    JeToOk = 1
                Else
                    JeToOk = 0
                    NeniOk = 0
                End If
            Next
        Next
        If JeToOk = 1 Then
            MsgBox("Je to ok")
        Else
            MsgBox("Neni to ok")
        End If

A chtěl jsem se zeptat jestli neexistuje nějaké lepší řešení.

Budu porovnávat o něco větší obrázky a hlavně rychle za sebou…..

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Nejrychlejší by bylo spočítat MD5 hash souboru s obrázkem, ale záleží jestli za shodnost považujete i metadata obrázku (EXIF informace). Kromě toho že váš způsob je neúnosně pomalý a neefektivní, ani nepočítá s průhledností (pokud existuje)...

nahlásit spamnahlásit spam 1 / 1 odpovědětodpovědět

podľa mňa sa na to vb.net vôbec nehodí

nahlásit spamnahlásit spam 0 odpovědětodpovědět

A proč by se na to nehodil? Evidentně o VB.NET absolutně nic nevíte.

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Děláte to zbytečně složitě, stačí porovnávat bmpa.GetPixel a bmpb.GetPixel. Navíc když nalezete první rozdíl, můžete z cyklů vyskočit hned, pamatovat si ve dvou proměnných stav, to je fakticky zbytečné. Doporučuji z tohohle udělat funkci a při nalezení prvního rozdílu z ní vyskočit pomocí Return False a pokud celý cyklus projde, za něj napsat Return True.

Jinak metoda GetPixel je dost pomalá, většinou se to dělá nějak rychleji - pomocí metody Lock a Unlock si vytáhnete z bitmapy RAW data, což je vlastně pole bajtů, pak stačí porovnat jednotlivé bajty a je to asi tak 1000x rychlejší. Někde tady na webu na to jistě bude ukázkový příklad.

nahlásit spamnahlásit spam 1 / 1 odpovědětodpovědět

Děkuji Vám za odpověď. Trochu jsem to upravil:

Dim bmpa As New Bitmap(PictureBox1.Image)
        Dim bmpb As New Bitmap(PictureBox2.Image)
        Dim JeToOk As Integer = 1
             ' obrazek ma velikost 30
        For Y = 1 To 30
            For X = 1 To 30
                If bmpa.GetPixel(X, Y) <> bmpb.GetPixel(X, Y) Then
                    JeToOk = 0
                    Exit For
                    Exit For
                End If
            Next
        Next
        If JeToOk = 1 Then
            MsgBox("Je to ok")
        Else
            MsgBox("Neni to ok")
        End If

Pomocí metody Lock a Unlock si vytáhnete z bitmapy RAW data – tak na tohle mé schopnosti zatím nestačí, ale děkuji za odpověď a k navedení správným směrem…..

nahlásit spamnahlásit spam 1 / 1 odpovědětodpovědět

Máte nedostatky už v základech. Vámi uvedené druhé Exit For nezpůsobí jak se zřejmě domníváte opuštění vnitřního i vnějšího cyklu, ale pouze vnitřního. Na celkové opuštění několika zapouzdřených cyklů je nejlepší použít příkaz GoTo.

For Y = 1 To 30
  For X = 1 To 30
    If bmpa.GetPixel(X, Y) <> bmpb.GetPixel(X, Y) Then
      JeToOk = 0
      GoTo Konec
    End If
  Next
Next
Konec:
If JeToOk = 1 Then
  MsgBox("Je to ok")
Else
  MsgBox("Neni to ok")
End If

nahlásit spamnahlásit spam 1 / 1 odpovědětodpovědět
                       
Nadpis:
Antispam: Komu se občas házejí perly?
Příspěvek bude publikován pod identitou   anonym.
  • Administrátoři si vyhrazují právo komentáře upravovat či mazat bez udání důvodu.
    Mazány budou zejména komentáře obsahující vulgarity nebo porušující pravidla publikování.
  • Pokud nejste zaregistrováni, Vaše IP adresa bude zveřejněna. Pokud s tímto nesouhlasíte, příspěvek neodesílejte.

přihlásit pomocí externího účtu

přihlásit pomocí jména a hesla

Uživatel:
Heslo:

zapomenuté heslo

 

založit nový uživatelský účet

zaregistrujte se

 
zavřít

Nahlásit spam

Opravdu chcete tento příspěvek nahlásit pro porušování pravidel fóra?

Nahlásit Zrušit

Chyba

zavřít

feedback