Hallo,
ich habe sowohl ein Performance- als auch ein Genauigkeitsproblem in der Prozedur.
Um was geht es
Ich möchte alle Pixel, die sich innerhalb eines kreisähnlichen Weges befinden, weiß machen; siehe Bild.
Dafür hole ich mir die xmin, xmax, ymin und ymax aus meiner
Dann iteriere ich von
Ich hatte das Problem schon einmal, habe jedoch letzten Endes einen graphicsPath benutzt und konnte dementsprechend
Anbei der Code. Obwohl ich mit einem Step von 1/20 iteriere, werden trotzdem einige Pixel (oder ganze Linien) ausgelassen. Mittlerweile braucht die Prozedur bei meinem Testbild 8 Minuten, obwohl sie asynchron läuft. Was kann man tun?
ich habe sowohl ein Performance- als auch ein Genauigkeitsproblem in der Prozedur.
Um was geht es
Ich möchte alle Pixel, die sich innerhalb eines kreisähnlichen Weges befinden, weiß machen; siehe Bild.
Dafür hole ich mir die xmin, xmax, ymin und ymax aus meiner
List(of PointF) Manually_drawn_path_on_image
.Dann iteriere ich von
xmin
zu xmax
und von ymin
zu ymax
.Ich hatte das Problem schon einmal, habe jedoch letzten Endes einen graphicsPath benutzt und konnte dementsprechend
GraphicsPath.isVisible
nutzen. Einen solchen GraphicsPath nutze ich nicht mehr.Anbei der Code. Obwohl ich mit einem Step von 1/20 iteriere, werden trotzdem einige Pixel (oder ganze Linien) ausgelassen. Mittlerweile braucht die Prozedur bei meinem Testbild 8 Minuten, obwohl sie asynchron läuft. Was kann man tun?
VB.NET-Quellcode
- Private Async Sub Button_weissen_Click(sender As Object, e As EventArgs) Handles Button_weissen.Click
- If LoadedImage Is Nothing OrElse Manually_drawn_path_on_image.Count = 0 Then
- Return
- End If
- Button_weissen.BackColor = Color.FromArgb(255, 255, 0)
- Await Task.Run(Sub() weissen())
- Button_weissen.BackColor = Color.FromArgb(0, 207, 0) ' green
- If System.IO.File.Exists(Application.StartupPath & "\Piano C2 Wav.wav") Then
- My.Computer.Audio.Play(Application.StartupPath & "\Piano C2 Wav.wav", Microsoft.VisualBasic.AudioPlayMode.Background)
- End If
- End Sub
- Private Sub weissen()
- Dim xmin As Single = Manually_drawn_path_on_image.Min(Function(p) p.X) - 1.0F
- Dim xmax As Single = Manually_drawn_path_on_image.Max(Function(p) p.X) + 1.0F
- Dim ymin As Single = Manually_drawn_path_on_image.Min(Function(p) p.Y) - 1.0F
- Dim ymax As Single = Manually_drawn_path_on_image.Max(Function(p) p.Y) + 1.0F
- Dim gFd As Integer = Average_over_all_colors_in_that_rectangle.ToArgb()
- Dim cnt As UInteger = 0UI
- For x As Single = xmin To xmax Step (1.0F / 20.0F)
- For y As Single = ymin To ymax Step (1.0F / 16.0F)
- Dim p As New PointF(x, y)
- Dim IsInside As Boolean = Manually_drawn_path_on_image.Exists(
- Function(f) _
- (CInt(f.Y) = CInt(p.Y) OrElse CInt(f.Y) = CInt(p.Y) + 1I OrElse CInt(f.Y) = CInt(p.Y) - 1I OrElse CInt(f.Y) = CInt(p.Y) - 2I OrElse CInt(f.Y) = CInt(p.Y) + 2I) AndAlso CInt(f.X) <= CInt(p.X)) _
- AndAlso Manually_drawn_path_on_image.Exists(
- Function(f) _
- (CInt(f.Y) = CInt(p.Y) OrElse CInt(f.Y) = CInt(p.Y) + 1I OrElse CInt(f.Y) = CInt(p.Y) - 1I OrElse CInt(f.Y) = CInt(p.Y) - 2I OrElse CInt(f.Y) = CInt(p.Y) + 2I) AndAlso CInt(f.X) >= CInt(p.X))
- If Not IsInside Then
- Continue For
- Else
- cnt += 1UI
- End If
- Dim xi As Integer = CInt(Math.Round(x, 0))
- Dim yi As Integer = CInt(Math.Round(y, 0))
- Dim aktuelle_Farbe As Integer = LoadedImage.GetPixel(xi, yi).ToArgb()
- If Not (CDbl(aktuelle_Farbe) <= CDbl(gFd * (1.0 + ProzentAbweichung / 100.0)) OrElse CDbl(aktuelle_Farbe) >= CDbl(gFd * (1.0 - ProzentAbweichung / 100.0))) Then
- LoadedImage.SetPixel(xi, yi, Color.White)
- End If
- Next
- Next
- LoadedImage.Save(Environment.GetFolderPath(Environment.SpecialFolder.Desktop) & $"\{Date.Now.ToString("G", Deu).Replace(":"c, "-"c)}.png", Imaging.ImageFormat.Png)
- End Sub
Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Bartosz“ ()