Picturebox Image abgleichen

  • VB.NET

Es gibt 10 Antworten in diesem Thema. Der letzte Beitrag () ist von vbler.

    Picturebox Image abgleichen

    Hey, ich wollte das wenn man auf einen Button klickt Folgendes abgefragt wird:

    VB.NET-Quellcode

    1. If PictureBox1.Image.Equals(My.Resources.MeinBild1) Then
    2. PictureBox1.Image = My. Resources.MeinBild2
    3. Else
    4. PictureBox1.Image = My.Resources.MeinBild1
    5. End If


    Mein Problem ist, dass selbst wenn PictureBox1.Image = MeinBild1 ist, wird der Else Code ausgeführt.
    Warum?

    MfG xKeskiller
    Habe ich auch schon probiert, da passiert das gleiche.

    Wenn ich es so mache geht es übrigens auch nicht.

    VB.NET-Quellcode

    1. Dim Bild As Image = My.Resources.MeinBild1
    2. If PictureBox1.Image.Equals(Bild) Then
    3. 'code
    4. End If
    Dann definiere bitte mal "Gleichheit." Meinst du damit, dass es dasselbe Image-Objekt ist, oder nur, dass die Bilder gleich sind?
    das ist doch alles fail xD
    Mach dir ne BooleanVariable (oder vllt sogar ein enum) welches du veränderst wenn sich das Bild ändert - iwo muss das Bild der PB ja auch zugewiesen werden. Dann fragst du nichtmehr die Picturebox welches bild denn nun drinnen ist sonder die BooleanVariable oder Enum-Variable.

    besser, eindeutiger
    Ok danke haiyyu.
    Aber kann mir bitte jemand sagen was es mit PixelFormat auf sich hat?

    //EDIT
    Ok hat doch nichts gebracht, da meine bilder von breite und höhe usw. gleich sind. Lediglich die Motive sind unterschiedlich.

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

    Du kommst nicht drumrum - post#4: Definiere Gleichheit. Sind 2 Bilder, die dasselbe zeigen, gleich, oder sinds doch 2 verschiedene Bilder?
    Naja - Philosophie.

    Deiner Post#1-Anforderung kannste genügen, wennde beide Bitmaps in ein Bitmap-Array packst, und dann:

    VB.NET-Quellcode

    1. If PictureBox1.Image is myBmps(0) Then
    2. PictureBox1.Image = myBmps(1)
    3. Else
    4. PictureBox1.Image = myBmps(0)
    5. End If

    Geht auch als Einzeiler:

    VB.NET-Quellcode

    1. PictureBox1.Image = If(PictureBox1.Image is myBmps(0), myBmps(1), myBmps(0))
    Oder Du merkst Dir den Index des gesetzten Bildes in einer Variable und fragst die ab, lässt sich leichter testen.

    VB.NET-Quellcode

    1. Private Index As Integer = 1
    2. '...
    3. If Index = 1 Then
    4. PictureBox1.Image = My.Resources.MeinBild2
    5. Index = 2
    6. Else
    7. PictureBox1.Image = My.Resources.MeinBild1
    8. Index = 1
    9. End If
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Hier :

    VB.NET-Quellcode

    1. Option Strict On
    2. Option Explicit On
    3. Option Infer Off
    4. Imports System
    5. Imports System.Drawing ' Bitmap / Rectangle
    6. Imports System.Drawing.Imaging ' BitmapData / ImageLockMode
    7. Imports System.Runtime ' CompilerServices / InterOpServices
    8. Module modBitMapsEqual
    9. ''' <summary>
    10. ''' Ist in beiden Bitmap-Objekten das gleiche Bild enthalten?
    11. ''' (Kriterium: Alle Pixelwerte sind identisch)</summary>
    12. ''' <param name="bmp1">Erste Bitmap für Vergleich</param>
    13. ''' <param name="bmp2">Zweite Bitmap für Vergleich</param>
    14. ''' <returns>True, falls gleiches Bild, sonst False</returns>
    15. <CompilerServices.Extension()> _
    16. Public Function IsEqual(ByVal bmp1 As Bitmap, ByVal bmp2 As Bitmap) As Boolean
    17. Dim equal As Boolean = True ' für Pixelvergleich
    18. ' Sind zwei Bilder vorhanden?
    19. If bmp1 Is Nothing Or bmp2 Is Nothing Then Return False
    20. ' Gleiche Klassen-Instanz ---> gleiches Bild
    21. If Bitmap.ReferenceEquals(bmp1, bmp2) Then Return True
    22. ' Ungleiche Größe/Farbtiefe --> ungleiches Bild
    23. With bmp1
    24. If .Width <> bmp2.Width Then Return False
    25. If .Height <> bmp2.Height Then Return False
    26. If .PixelFormat <> bmp2.PixelFormat Then Return False
    27. End With
    28. ' Bei beiden Bitmaps alle Bild-Daten im Speicher sperren
    29. Dim rect As New Rectangle(0, 0, bmp1.Width, bmp1.Height)
    30. Dim bd1 As BitmapData = bmp1.LockBits(rect, ImageLockMode.ReadOnly, bmp1.PixelFormat)
    31. Dim bd2 As BitmapData = bmp2.LockBits(rect, ImageLockMode.ReadOnly, bmp2.PixelFormat)
    32. ' Gesamtzahl der Bild-Bytes per Scanbreite & Bildhöhe ermitteln
    33. Dim ByteZahl As Integer = bd1.Stride * bd1.Height
    34. ' Bitmap-Daten besorgen (Bytearray)
    35. Dim bmp1_bytes(ByteZahl - 1), bmp2_bytes(ByteZahl - 1) As Byte
    36. ' Die gesperrten Bilddaten in 2 Bytearrays kopieren
    37. InteropServices.Marshal.Copy(bd1.Scan0, bmp1_bytes, 0, ByteZahl)
    38. InteropServices.Marshal.Copy(bd2.Scan0, bmp2_bytes, 0, ByteZahl)
    39. ' Bitmap-Daten vergleichen
    40. For i As Integer = 0 To ByteZahl - 1
    41. If bmp1_bytes(i) <> bmp2_bytes(i) Then
    42. equal = False : Exit For
    43. End If
    44. Next i
    45. ' Daten und Ressourcen freigeben
    46. bmp1.UnlockBits(bd1) : bmp2.UnlockBits(bd2)
    47. ' Rückgabe
    48. Return equal
    49. End Function
    50. End Module