Visual Basic GetPixel Farbe "ignorieren"

  • VB.NET

Es gibt 8 Antworten in diesem Thema. Der letzte Beitrag () ist von MaxeStudios.

    Visual Basic GetPixel Farbe "ignorieren"

    Hallo! Schon ist das eine Problem beseitigt kommt die nächste Frage :whistling:

    Ich lese für ein Spiel ein Bild aus und werte aus welche Farbe am häufigsten vorkommt. Dies mache ich folgend:

    VB.NET-Quellcode

    1. PixelCounter = 0
    2. Picture = Bitmap.FromFile("colorsplash.png")
    3. For x As Integer = 0 To Picture.Width - 1
    4. For y As Integer = 0 To Picture.Height - 1
    5. With Picture.GetPixel(x, y)
    6. A += .A
    7. R += .R
    8. G += .G
    9. B += .B
    10. End With
    11. PixelCounter += 1
    12. Next
    13. Next
    14. A = A / PixelCounter
    15. R = R / PixelCounter
    16. G = G / PixelCounter
    17. B = B / PixelCounter
    18. aColor = Color.FromArgb(A, R, G, B)
    19. PictureBox1.BackColor = aColor​



    Das ist auch überhaupt kein Problem. Nur oft kommt es halt vor dass die Hintergrundfarbe des Fensters öfter vorkommt, als andere.
    Ich würde gerne diese Farbe auf eine Art Blacklist setzen ^^ (you know what I mean) Wie schaffe ich es dass mein Programm diese Farbe nicht zählt/auswertet oder wie auch immer? Ich glaube ich habe nicht die passenden Suchbegriffe oder bin wohl der einzige mit dem Problem.


    Danke :whistling: :rolleyes:

    ╔══╦═╦╦╦═╦══╦══╦╗╔╦═╦╦═╦══╗
    ║║║║╩╠..╣╦╬╗╚╬╗╔╣╚╝║╠║║║╠╗╚╣
    ╚╩╩╩╩╩╩╩═╩══╝╚╝╚══╩═╩╩═╩══╝
    Ich versteh's grad nicht.
    1. Warum sollte die Fensterhintergrundfarbe in nem Bild massenhaft auftauchen? Redest Du von der VB-Formular-Hintergrundfarbe? Ist das Zufall, dass Du jene Farbe in Deinen Bildern hast?
    2. Der Code macht m.E. nicht das, was er soll. Angenommen Du hättest nur 2 Punkte: Schwarz und Weiß. Mit Deinem Code kommt als Hintergrundfarbe ein Grau raus. Da wird nicht ermittelt, welche Farbe am häufigsten vorkommt. Oder blick ich da was prinzipielles nicht?

    ##########

    Wenn Du wirklich die häufigste Farbe des Bildes herausfinden willst, musst Du schon das Ganze anders gestalten. brute force-Vorschlag zum Abend: Eine ListOf(Farbe, Counter) und dann entsprechend zählen. Zum Schluss nach Counter absteigend sortieren. Sollte dann diese ominöse Fensterfarbe auf Platz 1 stehen - nimm Platz 2.
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „VaporiZed“ ()

    @MaxeStudios Mir ist völlig unklar, was überhaupt Du da zählst.
    Die R, G, B-Komponenten einzeln haben doch gar keine Aussage.
    Wenn, dann wie @VaporiZed schrieb, die Farben als solche zählen, oder Du konvertierst die Farben in den HSV-Raum und zählst die H-Komponente, dabei geht aber die Helligkeit und die Sättigung verloren.
    Und:
    Wenn Du die Bitmap lockst, kannst Du mit sehr viel schnelleren Operationen als GetPixel() arbeiten.
    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!
    Sorry war etwas schlecht erklärt

    @VaporiZed eigentlich funktioniert das ganze bei mir super, und es kommt bei mir auch keine Mischung aus den Farben raus. @RodFromGermany Und ja, das ganze ist wie du sagtest nicht soo schnell, reicht mir aber völlig aus.


    Ich zitiere mal meine Erklärung des Spieles aus einem anderen Beitrag:

    MaxeStudios schrieb:

    es geht um ein spiel, ja vb.net und spiele ist nicht die faust aufs auge aber es soll eine herausforderung für mich werden und ist auch nicht sooo kompliziert.
    Es ist ein multiplayer (über pfeil tasten und wasd, also an einem pc); du steuerst eine picturebox und hinterlässt eine farbspur. Du musst versuchen so viel wie möglich vom bildschirm mit deiner farbe zu bedecken. wessen farbe öfter vorkommt, derjenige hat gewonnen.



    Soweit so gut.
    Ich hatte jetzt daran gedacht dass das Spiel einen Screenshot von der Spiel Fläche macht und abspeichert, das ganze auswertet, siehe mein Problem, und wieder löscht.
    Das mit dem Screenshot funktioniert super. Aber die Windows Form Hintergrundfarbe (Als Standart ist ja "Control" eingestellt) kommt halt öfters vor.

    Aber wobei es dann nach euch einfacher gehen würde, meinst du die Bitmap.LockBits Methode siehe msdn.microsoft.com/de-de/library/5ey6h79d(v=vs.110).aspx ?

    ╔══╦═╦╦╦═╦══╦══╦╗╔╦═╦╦═╦══╗
    ║║║║╩╠..╣╦╬╗╚╬╗╔╣╚╝║╠║║║╠╗╚╣
    ╚╩╩╩╩╩╩╩═╩══╝╚╝╚══╩═╩╩═╩══╝
    Hat sich erledigt, habe das ganze ganz anders umgesetzt. Trozdem Danke für eure Mühe! :D

    ╔══╦═╦╦╦═╦══╦══╦╗╔╦═╦╦═╦══╗
    ║║║║╩╠..╣╦╬╗╚╬╗╔╣╚╝║╠║║║╠╗╚╣
    ╚╩╩╩╩╩╩╩═╩══╝╚╝╚══╩═╩╩═╩══╝
    Der Zweck war für mein Spiel total unpassend und ich hab es jetzt gaaaanz anders umgesetzt, für meinen Zweck. Ich glaube nicht dass diese Methode anderen helfen wird da ich jetzt was komplett anderes benutzt habe :D

    ╔══╦═╦╦╦═╦══╦══╦╗╔╦═╦╦═╦══╗
    ║║║║╩╠..╣╦╬╗╚╬╗╔╣╚╝║╠║║║╠╗╚╣
    ╚╩╩╩╩╩╩╩═╩══╝╚╝╚══╩═╩╩═╩══╝
    @MaxeStudios Die Lösung nicht mal zu nennen ist zumindest sehr unhöflich von Dir. :thumbdown:
    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!
    Okay ich such sie gerne raus, will nur keine Verwirrung auslösen da diese wie schon gesagt ganz anders ist, ich lad sie gleich hoch ^^

    Ich habe die Sache mit dem Screenshot komplett raus genommen und stattdessen folgenden code eingebaut der ausgeführt wird, wenn sich der Nutzer bewegt (und sich eine farbspur bildet):

    VB.NET-Quellcode

    1. Public Class mygame
    2. Dim myinteger As Integer = 0
    3. 'bliblablupp mein Sub
    4. myinteger = myinteger + 1
    5. End Sub
    6. End Class

    und das für jeden der beiden nutzer

    Bei wem am ende der Integer größer ist, der hat dann logischerweise mehr Farbspuren. Das wars auch schon :D

    ╔══╦═╦╦╦═╦══╦══╦╗╔╦═╦╦═╦══╗
    ║║║║╩╠..╣╦╬╗╚╬╗╔╣╚╝║╠║║║╠╗╚╣
    ╚╩╩╩╩╩╩╩═╩══╝╚╝╚══╩═╩╩═╩══╝

    Dieser Beitrag wurde bereits 3 mal editiert, zuletzt von „MaxeStudios“ ()