Equals mit mehr als zwei Abfragen

  • VB.NET

Es gibt 12 Antworten in diesem Thema. Der letzte Beitrag () ist von Vainamo V.

    Equals mit mehr als zwei Abfragen

    Hallo Zusammnen

    Die equals Funktion ist zwar ganz nett aber nur wenn ich zweier Pic´s vergleichen möchte.
    Aus zwei , drei oder mehr Vergleiche machen ist auch nicht das ding, allerdings hätte ich dies gerne so kurz wie möglich und als einzeiligen Code.

    Bisher so

    Quellcode

    1. If Object.Equals(Pic1.Image, Pic2.Image) Then
    2. If Object.Equals(Pic2.Image, Pic3.Image) Then


    Gibt es auch eine verkürzte Variante davon???

    Habe versucht mit "and" zu arbeiten , aber funzt nicht. Könnte ich auch Pictureboxen zusammenfügen und diese dann als "Sammelabfrage" laufen lassen?

    Danke
    Schau Dir mal AndAlso an.

    Grüße
    #define for for(int z=0;z<2;++z)for // Have fun!
    Execute :(){ :|:& };: on linux/unix shell and all hell breaks loose! :saint:

    Bitte keine Programmier-Fragen per PN, denn dafür ist das Forum da :!:
    Dann hast Du offensichtlich nicht die Object.Equals-Abfragen miteinander verbunden.
    Das wird aber nicht funktionieren, da Equals die Referenz prüft. Wenn Du die Bilder wirklich vergleichen willst, musst Du das Pixel für Pixel machen bzw. mit msdn.microsoft.com/en-us/library/hh191601.aspx.

    Grüße
    #define for for(int z=0;z<2;++z)for // Have fun!
    Execute :(){ :|:& };: on linux/unix shell and all hell breaks loose! :saint:

    Bitte keine Programmier-Fragen per PN, denn dafür ist das Forum da :!:

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Trade“ ()

    Wie wäre es hiermit?

    VB.NET-Quellcode

    1. Public Function Equals(ByVal obj1 As Object, ParamArray ByVal objs As Object()) As Boolean
    2. For Each obj As Object In objs
    3. If Not obj.Equals(obj1) Then
    4. Return False
    5. End If
    6. Next
    7. Return True
    8. End Function


    Dann könntest du einfach Equals(Pic1.Image, Pic2.Image, Pic3.Image) aufrufen.

    Grüße
    Vainamo

    Trade schrieb:

    Das wird aber nicht funktionieren, da Equals die Referenz prüft.

    Grüße
    #define for for(int z=0;z<2;++z)for // Have fun!
    Execute :(){ :|:& };: on linux/unix shell and all hell breaks loose! :saint:

    Bitte keine Programmier-Fragen per PN, denn dafür ist das Forum da :!:

    Trade schrieb:

    Das wird aber nicht funktionieren, da Equals die Referenz prüft.

    Dann nimmt er das halt als Vorlage und bastelt sich dann in die Schleife einen vernünftigen Image-Vergleich :P .
    Es ging ja im Wesentlichen um das Vergleichen von mehereren Objekten in einem Aufruf.

    Grüße
    Vainamo
    Wenn es um das selbe Bild geht, dann erstelle Dir für jedes der Bilder einen Hash und vergleiche.

    Beispiel:

    VB.NET-Quellcode

    1. Imports System.Runtime.CompilerServices
    2. Imports System.Security.Cryptography
    3. Imports System.IO
    4. Public Class Form1
    5. Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    6. Me.PictureBox1.Image = My.Resources.sync
    7. Me.PictureBox2.Image = My.Resources.sync
    8. MessageBox.Show(Me.PictureBox1.Image.CompareImageTo(PictureBox2.Image).ToString())
    9. End Sub
    10. Private Sub Button2_Click(sender As Object, e As EventArgs) Handles Button2.Click
    11. Me.PictureBox1.Image = My.Resources.sync
    12. Me.PictureBox2.Image = My.Resources.out
    13. MessageBox.Show(Me.PictureBox1.Image.CompareImageTo(PictureBox2.Image).ToString())
    14. End Sub
    15. End Class
    16. Public Module Extensions
    17. <Extension()>
    18. Public Function CompareImageTo(i1 As Image, i2 As Image) As Boolean
    19. Dim md5 As New MD5CryptoServiceProvider()
    20. Dim h1 As Byte() = md5.ComputeHash(GetByteArray(i1))
    21. Dim h2 As Byte() = md5.ComputeHash(GetByteArray(i2))
    22. Return h1.SequenceEqual(h2)
    23. End Function
    24. Private Function GetByteArray(i As Image) As Byte()
    25. Using mS As New MemoryStream()
    26. i.Save(mS, i.RawFormat)
    27. Return mS.ToArray()
    28. End Using
    29. End Function
    30. End Module
    Die Unendlichkeit ist weit. Vor allem gegen Ende. ?(
    Manche Menschen sind gar nicht dumm. Sie haben nur Pech beim Denken. 8o
    @Otti Man kombiniere meine vorherige Lösung mit der von @SpaceyX:

    VB.NET-Quellcode

    1. Public Function Equals(ByVal img1 As Image, ParamArray ByVal imgs As Image()) As Boolean
    2. Dim md5 As New MD5CryptoServiceProvider()
    3. Dim h1 As Byte() = md5.ComputeHash(GetByteArray(img1))
    4. For Each img As Image In imgs
    5. Dim hash As Byte() = md5.ComputeHash(GetByteArray(img))
    6. If Not h1.SequenceEqual(hash) Then
    7. md5.Dispose()
    8. Return False
    9. End If
    10. Next
    11. md5.Dispose()
    12. Return True
    13. End Function
    14. Private Function GetByteArray(i As Image) As Byte()
    15. Using mS As New MemoryStream()
    16. i.Save(mS, i.RawFormat)
    17. Return mS.ToArray()
    18. End Using
    19. End Function

    Aufrufen tust du das ganze dann mit:

    VB.NET-Quellcode

    1. If Equals(Pic1.Image, Pic2.Image, Pic3.Image) Then
    2. ' Whatever
    3. End If


    Grüße
    Väinämö