Eine Frage zur Picturebox

  • VB.NET

Es gibt 23 Antworten in diesem Thema. Der letzte Beitrag () ist von Kangaroo.

    Eine Frage zur Picturebox

    Hallo Leute,

    Ich habe mal eine Frage zur Picturebox.
    Also ich möchte wenn in einer Picturebox ein bestimmtes Bild ist, etwas passiert. Ich wollte den Code so schreiben :

    Quellcode

    1. if Picturebox1.image = My.Resources.einbild then label1.text = "Okay"



    Nur dann wird Picturebox1.image = My.Resources.einbild unterstrichen und folgener Fehler wird angezeigt :


    Fehler 1 Der =-Operator ist für die Typen "System.Drawing.Image" und "System.Drawing.Bitmap" nicht definiert. C:\Users\Cato\documents\visual studio 2010\Projects\Laufen1\Laufen1\Form1.vb 1007 12 Laufen1


    Ich bin mittlerweile echt am verzweifeln oO.

    Ich hoffe echt auf Hilfe. Thx im vorraus

    Lg Cato

    Noch einmal die Picturebox......

    Ich bin nochmal...

    Ich habe das Thema zu schnell als erledigt abgetan...

    das Problem ist es soll wenn ein bestimmtes Bild in einer Picturebox ist, etwas passieren. Jetzt wollte ich es so lösen :

    Quellcode

    1. if picturebox1.image is my.ressources.bild then label1.text = "Okay"


    Es wird auch kein Fehler angezeigt aber in der Form passiert trotzdem nichts.
    Was ist denn diesmal falsch? oO

    Edit by Manschula: Man muss kein zweites Thema eröffnen, nur weil das erste voreilig als "Erledigt" markiert wurde --> Themen zusammengeführt

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

    Hmm....

    Ist zwar lang..ABER wirksam.

    Spoiler anzeigen

    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



    Anwendung bei dir:

    VB.NET-Quellcode

    1. Dim pic1 As New Drawing.Bitmap(PictureBox1.Image)
    2. Dim pic2 As New Drawing.Bitmap(My.Resources.bild)
    3. If pic1.IsEqual(pic2) Then
    4. Label1.Text = "Hallo"
    5. End If



    EDIT: @M wie Marin: "=" geht für System.Drawing.Image und System.Drawing.Bitmap nicht!
    Whos Faster ALPHA: Bald....

    cato3512 schrieb:

    Fehler 1 Der =-Operator ist für die Typen "System.Drawing.Image" und "System.Drawing.Bitmap" nicht definiert.

    Daran sieht man eigendlch schon das es sich um 2 unterschiedliche Typen handelt. Du musst vermutlich eins von beiden Converten.


    Mfg, jmb.96 :)
    "People assume that time is a strict progression of cause to effect, but actually, from a non-linear, non-subjective viewpoint, it's more like a big ball of wibbly wobbly, ...timey wimey ...stuff."

    cato3512 schrieb:

    Also ich möchte wenn in einer Picturebox ein bestimmtes Bild ist, etwas passiert. Ich wollte den Code so schreiben

    Mal eine andere Frage: warum musst Du ausgerechnet das Bild in der Picturebox mit der Quelle in den Resourcen vergleichen ?

    Du kannst ja auch eine Information in der Property 'Tag' der Picturebox hinterlegen
    Die Typen Bitmap und Image sind Referenztypen und somit ist kein Wertevergleich möglich.

    Ich würde generell davon abraten Bilder zu vergleichen, wenn es nicht absolut nötig ist.
    Du solltest Dein System nochmal überarbeiten und irgenwie zwischenspeichern, welches Bild angezeigt wird.


    Edit: Wäre auch eine Möglichkeit, aber ich denke es müsste noch einfacher gehen.
    "Luckily luh... luckily it wasn't poi-"
    -- Brady in Wonderland, 23. Februar 2015, 1:56
    Desktop Pinner | ApplicationSettings | OnUtils
    Nimm die Namen der Bilder in der Ressource, merke Dir den Namen, wenn Du ein Bild zuweist und vergleiche dann die Namen.
    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!
    Ich denke es ist hier vorteilhaft, wenn Du etwas weitgehender erklärst was Du machen möchtest.
    Dann können wir Dir bessere Vorschläge machen.
    "Luckily luh... luckily it wasn't poi-"
    -- Brady in Wonderland, 23. Februar 2015, 1:56
    Desktop Pinner | ApplicationSettings | OnUtils
    Mittlerweile ein kleines Spiel. Und dazu muss ich jetzt ne Kollisionsabfrage schreiben. Also da kann man so Blöcke hinsetzen und wenn man auf Ein Feld klickt dann wird das zu dem Block. Also die Picturebox ändert das Bild. Und jetzt möchte ich es machen das wenn da das Bild eines Blocks ist man da nicht mehr durchgehen kann. so aber dafür muss das Programm ja erst mal erkennen das da jetzt dieses Bild ist. Und genau das bekomm ich nicht hin....

    Ich hänge mal einen Test an.
    Dateien
    • Laufen1.exe

      (136,7 kB, 246 mal heruntergeladen, zuletzt: )

    cato3512 schrieb:

    Und jetzt möchte ich es machen das wenn da das Bild eines Blocks ist man da nicht mehr durchgehen kann

    Also dich interessiert eigentlich weniger das Bild, sondern die Info ob dieses 'blockt' oder auch nicht. Da Du das vermutlich beim Laden der Picturebox schon weisst, kannst du wie oben gesagt das Feld Tag der Picturebox verwenden um diese Info zu speichern:

    VB.NET-Quellcode

    1. ' picturebox aus resourcen laden
    2. PictureBox1.Image = My.Resources.BlauesBild
    3. ' tag auf einen string wert setzen
    4. PictureBox1.Tag = "geblockt"
    5. .....
    6. ' Tag derPicturebox1 abfragen
    7. If CStr(PictureBox1.Tag) = "geblockt" Then
    8. MessageBox.Show("Das Feld ist geblockt")
    9. ' tuwasanderes
    10. End If