GetPixel in Threads

  • VB.NET
  • .NET (FX) 4.5–4.8

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

    GetPixel in Threads

    Hallo,
    ich weiß nicht ob ich in diesem Bereich richtig bin, aber da es mit Bildern zu tun hat, werde ich in der Multimedia-Abteilung richtig sein :)

    Ich habe ein Problem: Ich möchte aus zeitlichen Gründen 5 Bilder gleichzeitig über 5 Threads Pixel für Pixel mit GetPixel() abtasten und die Farb-Werte dann in Arrays speichern. Jedes Bild ist 55 Px mal 54 Px groß.
    Nur sobald ich einen 2. Thread gleichzeitig starte, funktioniert GetPixel() nicht mehr, bzw. die For-Schleife mit GetPixel().

    Als Beispiel hier der Aufruf von 2 Threads:

    VB.NET-Quellcode

    1. Dim BestimmeFarbenThread1 As New Threading.Thread(AddressOf BestimmeFarben1)
    2. Dim BestimmeFarbenThread2 As New Threading.Thread(AddressOf BestimmeFarben2)
    3. BestimmeFarbenThread1.Start()
    4. BestimmeFarbenThread2.Start()



    Ein Thread sieht bei mir so aus:

    VB.NET-Quellcode

    1. Dim Bild As Bitmap = CType(PictureBox1.Image, Bitmap)
    2. For i As Integer = 0 To 2862
    3. For X As Integer = 0 To 54
    4. For Y As Integer = 0 To 53
    5. RPB1(i) = Bild.GetPixel(X, Y).R.ToString
    6. GPB1(i) = Bild.GetPixel(X, Y).G.ToString
    7. BPB1(i) = Bild.GetPixel(X, Y).B.ToString
    8. Debug.WriteLine("PB1: " & i.ToString) 'Fortschritt von GetPixel()
    9. Next
    10. Next
    11. Next
    12. MsgBox("PB1 fertig!")


    Der 2. Thread entsprechend angepasst:

    VB.NET-Quellcode

    1. Public Sub BestimmeFarben2()
    2. Dim Bild As Bitmap = CType(PictureBox2.Image, Bitmap)
    3. For i As Integer = 0 To 2862
    4. For X As Integer = 0 To 54
    5. For Y As Integer = 0 To 53
    6. RPB2(i) = Bild.GetPixel(X, Y).R.ToString
    7. GPB2(i) = Bild.GetPixel(X, Y).G.ToString
    8. BPB2(i) = Bild.GetPixel(X, Y).B.ToString
    9. Debug.WriteLine("PB2: " & i.ToString)
    10. Next
    11. Next
    12. Next
    13. IO.File.WriteAllLines("array.txt", GPB2)
    14. MsgBox("PB2 fertig!")
    15. End Sub


    Ich lese die Rot-Werte, die Grün-Werte und die Blau-Werte einzeln aus, da mir aufgefallen ist, dass GetPixel() somit weniger Zeit braucht, als wenn ich alle Werte gleichzeitig auslesen würde. Desweiteren ist die Weiterverwendung für mich so einfacher, da ich später die einzelnen Farbkanäle untereinander vergleichen will anhand der Werte in den Arrays.
    Es fällt auf, dass wenn ich 2 Threads am laufen habe im Debugger der Fortschritt von GetPixel() bei 0 bleibt. Wo steckt der Fehler? :?:

    Nicolas

    MrNicolas3003 schrieb:

    5 Bilder gleichzeitig über 5 Threads
    Machst Du das, weil Du der Meinung bist, 5 Threads brauchen zusammen nur 20% der Zeit?
    Das ist ein Irrglaube, weil das System das organisiert.
    Wenn Du es echt parallelisieren willst, mach Parallel.For oder Parallel.ForEach, da bekommst Du die freien Cores optimal zugeteilt.
    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!
    Aber wie naftes schon sagt: Threading ist hier unangebracht.
    Stattdessen die performantere alternative "LockBits" nehmen.
    Zu "Lockbits" gibts auch ein Tutorial im Tutorial-Bereich.

    hmm - wer sowas codet:

    MrNicolas3003 schrieb:

    VB.NET-Quellcode

    1. RPB1(i) = Bild.GetPixel(X, Y).R.ToString
    Für den ist das Tut vermutlich zu hoch. Allerdings Threading ist erst recht zu hoch, denn offenbar besteht garkein Verständnis des Begriffs "Datentyp", wenn man FarbKanäle als String speichert. :thumbdown:

    So ganz allgemein: Grundlagen: Fachbegriffe
    Nützlich sicherlich auch: VisualStudio richtig nutzen (Google ist nicht deine Mami)

    Und natürlich ein gutes Buch lesen.
    Alternativ zum Löffelman auch den Kohler/Leibhard - siehe Entwickler-Ressourcen und Tools, Bücher und WebCasts
    Vielen Dank, ich werde mir LockBits anschauen :)


    Ich wollte noch hinzufügen, dass ich das als String auslese, damit ich es später einfach nicht mehr umwandeln muss, sondern ich es gleich als String vorliegen habe. Ob ich das nun gleich in einen String umwandle oder im entsprechenden Datentyp belasse und später umwandle ist quasi egal...
    Ach und danke für deine Einschätzung von mir, die hab ich echt gebraucht! Manchmal ist es auch einfach besser Leute, die Hilfe brauchen, an den Richtigen stellen zu helfen und nicht einfach Vorteile aufzustellen, weil man etwas gleich umwandelt anstatt später... übrigens sehr respektvoll von dir!
    Du magst eventuell ein guter Coder sein, vielleicht auch in mehreren verschiedenen Programmiersprachen - aber Menschenkenntnis und Respekt? Desweiteren stell ich mich auch nicht als "Super-Model" dar...
    Mir wurde geholfen, sehr gut sogar, aber nicht von dir. Und ob ich nun gut Code oder nicht, solange mein Programm die Funktion erbringt, die ich realisieren will bin ich zufrieden!
    Ich wollte das nur mal anmerken. Jedoch kannst du von mir denken was du willst und ich werde auf deine Meinung über mich in Zukunft nicht mehr eingehen.


    Was meine Lösung zu dem Problem angeht:
    Ich werde nun mir die Farben mit LockBits auslesen lassen, wie es nafets mir empfohlen hat, und eventuell - falls ich das dann überhaupt noch brauche - das Ganze so parallelisieren, wie es mir RodFromGermany mir empfohlen hat. Danke an euch beiden!

    Schöne Woche noch, Nicolas :)

    MrNicolas3003 schrieb:

    damit ich es später einfach nicht mehr umwandeln muss
    Wozu brauchst Du denn den String?
    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!
    ja, mag sein, ich bin ein arrogantes, respektloses A...h ohne ´Menschenkenntnis und so weiter.
    Aber ich empfehle dir: Sei dir nicht zu fein, von sonem Wüstling trotzdem Hinweise anzunehmen.
    Ich hab dir immerhin 4 sehr nützliche Links gegeben, und auf das Lockbits-Tut verwiesen - das kannste dann ja selber suchen.

    Also den 5 Dingen lohnt es sich glaub nachgehen, so oder so.




    Nochmal zu die Farbkanäle: So ein Farbkanal ist - wenn du die Pixelwerte mit Lockbits ausliest - vom Typ Byte.
    Bytes lassen sich irrsinnig schnell miteinander vergleichen, wohl 100mal schneller als Strings.

    Beim Proggen denkt man am besten die Daten wie sie sind, und hier sinds Bytes. Die Text-Datei sollte also aus Bytes generiert werden, und beim Einlesen sofort in Bytes konvertiert.
    Eine Datenhaltung in Form von Strings ist unangemessen und schlechter Stil.
    Auch erschwert/verbaut sie weitergehende Datenverarbeitungsmöglichkeiten, etwa Sortieren oder Verändern der Daten.

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