Rubrik: Grafik und Font · Bilder und Icons | VB-Versionen: VB2005, VB2008 | 06.11.09 |
Prüfen, ob zwei Bilder identisch sind Dieser Tipp stellt eine Funktion zur Verfüfung, mit der sich prüfen lässt, ob es sich bei 2 angegebenen Bildern um identische Bilder handelt. | ||
Autor: Dieter Otter | Bewertung: | Views: 12.500 |
www.tools4vb.de | System: Win2k, WinXP, Win7, Win8, Win10, Win11 | Beispielprojekt auf CD |
Wie lassen sich zwei Bilder auf "Gleichheit" prüfen?
Die Equals-Eigenschaft des Image/Bitmap-Objekts scheidet in diesem Falls aus:
If Bitmap1.Equals(Bitmap2) Then ...
Um zwei Bilder miteinander zu vergleichen gibt es mehrere Möglichkeiten: Eine wäre ein Pixel-für-Pixel Vergleich, was jedoch zugegebenermaßen nicht gerade performant ist.
Eine andere Möglichkeit wäre, das Bitmap/Image in ein Byte-Array zu konvertieren und den jeweiligen Hash-Wert miteinander zu vergleichen.
Und genau das macht nachfolgende Funktion:
''' <summary> ''' Vergleicht zwei Bitmaps miteinader. ''' </summary> ''' <param name="Bitmap1">Bitmap oder Image</param> ''' <param name="Bitmap2">Bitmap oder Image</param> ''' <returns>True, wenn die Bitmaps identisch sind, andernfalls False.</returns> Public Function BitmapsEqual(ByVal Bitmap1 As Bitmap, ByVal Bitmap2 As Bitmap) As Boolean Dim bResult As Boolean = False ' Stimmt die Größe überein... If Bitmap1.Size = Bitmap2.Size Then ' ... Bitmaps in Byte-Array konvertieren With New System.Drawing.ImageConverter() Dim Bytes1 As Byte() = New Byte(0) {} Bytes1 = CType(.ConvertTo(New Bitmap(Bitmap1), Bytes1.[GetType]()), Byte()) Dim Bytes2 As Byte() = New Byte(0) {} Bytes2 = CType(.ConvertTo(New Bitmap(Bitmap2), Bytes2.[GetType]()), Byte()) ' Hash-Wert der beiden Bitmaps berechnen ... Dim SHA As New System.Security.Cryptography.SHA256Managed Dim Hash1 As Byte() = SHA.ComputeHash(Bytes1) Dim Hash2 As Byte() = SHA.ComputeHash(Bytes2) ' ... und miteinander vergleichen If Hash1.Length = Hash2.Length Then bResult = True For i As Integer = 0 To Hash1.Length - 1 If Hash1(i) <> Hash2(i) Then bResult = False Exit For End If Next i End If End With End If Return bResult End Function