Hallo zusammen,
Ich beiße mir seit gestern Abend immer noch die Zähne mit diesem Backgroundworker aus.
Nun wollte ich eine Funktion erstellen, die mir dass Bild in einzelne Schnittmengen unterteil, in etwa so dem bekannten Zauberstab in einigen Bildbearbeitungsprogrammen. Nur dass er nicht nur die angeklickte Farbe einlesen soll, sondern dass ganze Bild in einzelne Schnittmengen einteilen. Hier geht es jetzt nicht um dass "wie", da habe ich schon Ansätze,
Da die Berechnung bei einem großen Bild doch schon sehr Zeit in Anspruch nimmt, lagere ich diese ganze Arbeit in ein Backgroundworker aus. Um den Fortschritt zu sehen, habe ich eine Klasse mit EventArgs implementiert, die die momentanen Informationen zurück an die Form schickt. Darin sind unter anderem auch die aktuelle Position und die Farbe derer.
So und jetzt zu dem Problem
Rechts sieht man dass Orginale Bild, links dass was der Backgroundworker aus dem PixelArrayliest.
Hier der Code vom Backgroundworker
Habe schon einiges durch, alles nichts geholfen. Arbeite mit Vielen "Kind" Formularen die über ein Property in der Hauptklasse auf die Klasse mit den Funktionen zugreifen. Aus diesem Grund hab ich mal mit "Memberwise.Clone" die ganze Klasse kopiert, um sicherzustellen das der Backgroundworker nichts Threadübergreifendes versucht, hat aber auch nichts geholfen. LG
Nachtrag
Wenn ich in der Klasse auf das gespeicherte Bild mit GetPixel direkt die Daten lese, und diese dann durch das Event feuer, dann funktioniert es Ironischerweiße.
Logischerweiße komme ich dann zu dem Schluss - dass die Funktion mit Lockbits ein falsches Array einlesen würde, was ich aber zu 100% wiederlegen kann, da die Funktion zum lesen/schreiben nur mit der PixelArray Klasse von mir arbeitet, und diese auch nur 1 mal implementiert sind, zusätzlich funktionieren die anderen Filter, diese verwenden auch dass PixelArray und schieben es in die WriteFunktion.
Ich beiße mir seit gestern Abend immer noch die Zähne mit diesem Backgroundworker aus.
Allgemeines zum Aufbau :
Ein kleines Programm liest/ schreibt mit LockBit das Array eines Bild ein, und gibt mir dieses in einer "PixelArray" Klasse zurück.
Dieses kann ich dann durch verschiedene Filter schicken die die Werte manipulieren. Anschließen schiebe ich diese Klasse in die Funktion "WriteLockBit" diese verändert das Bild entsprechend.
Dass bedeutet, dass das Bild auch richtig eingelesen wurde, da die Filter funktionieren.
Ein kleines Programm liest/ schreibt mit LockBit das Array eines Bild ein, und gibt mir dieses in einer "PixelArray" Klasse zurück.
Dieses kann ich dann durch verschiedene Filter schicken die die Werte manipulieren. Anschließen schiebe ich diese Klasse in die Funktion "WriteLockBit" diese verändert das Bild entsprechend.
Dass bedeutet, dass das Bild auch richtig eingelesen wurde, da die Filter funktionieren.
Nun wollte ich eine Funktion erstellen, die mir dass Bild in einzelne Schnittmengen unterteil, in etwa so dem bekannten Zauberstab in einigen Bildbearbeitungsprogrammen. Nur dass er nicht nur die angeklickte Farbe einlesen soll, sondern dass ganze Bild in einzelne Schnittmengen einteilen. Hier geht es jetzt nicht um dass "wie", da habe ich schon Ansätze,
Da die Berechnung bei einem großen Bild doch schon sehr Zeit in Anspruch nimmt, lagere ich diese ganze Arbeit in ein Backgroundworker aus. Um den Fortschritt zu sehen, habe ich eine Klasse mit EventArgs implementiert, die die momentanen Informationen zurück an die Form schickt. Darin sind unter anderem auch die aktuelle Position und die Farbe derer.
So und jetzt zu dem Problem
Rechts sieht man dass Orginale Bild, links dass was der Backgroundworker aus dem PixelArrayliest.
Hier der Code vom Backgroundworker
VB.NET-Quellcode
- Private Sub BGW_DoWork(ByVal sender As Object, ByVal e As System.ComponentModel.DoWorkEventArgs) Handles BGW.DoWork
- 'Daten für das Array intern im Thread erstellen
- Dim myArray As PixelArray = MyOrginalKlasse.ReadLockBit(MyOrginalKlasse.GetMyPic)
- For x As Integer = 0 To MyOrginalKlasse.GetMyPic.Width - 1
- For y As Integer = 0 To MyOrginalKlasse.GetMyPic.Height - 1
- Dim t As New Point(x, y)
- Dim ns As New SchnittstellenEventArgs
- ns.GetThisColor = myArray.SetValue(t)
- ns.GetMyInnerLoop = New Point(x, y)
- RaiseEvent ReportProgress(Me, ns)
- n = True
- Next
- Next
- End Sub
Habe schon einiges durch, alles nichts geholfen. Arbeite mit Vielen "Kind" Formularen die über ein Property in der Hauptklasse auf die Klasse mit den Funktionen zugreifen. Aus diesem Grund hab ich mal mit "Memberwise.Clone" die ganze Klasse kopiert, um sicherzustellen das der Backgroundworker nichts Threadübergreifendes versucht, hat aber auch nichts geholfen. LG
Nachtrag
Wenn ich in der Klasse auf das gespeicherte Bild mit GetPixel direkt die Daten lese, und diese dann durch das Event feuer, dann funktioniert es Ironischerweiße.
Logischerweiße komme ich dann zu dem Schluss - dass die Funktion mit Lockbits ein falsches Array einlesen würde, was ich aber zu 100% wiederlegen kann, da die Funktion zum lesen/schreiben nur mit der PixelArray Klasse von mir arbeitet, und diese auch nur 1 mal implementiert sind, zusätzlich funktionieren die anderen Filter, diese verwenden auch dass PixelArray und schieben es in die WriteFunktion.
Dieser Beitrag wurde bereits 3 mal editiert, zuletzt von „Bagplatt“ ()