Neu
Hallo zusammen,
aktuell möchte ich Bilder von meinen Modelleisenbahnmodellen transparent machen, in dem ich den weißen Hintergrund entfernen möchte. Klappt aktuell auch schon ganz gut.
Im zweiten Schritt soll nun mein Bild von allen Seiten beschnitten werden, so dass am Ende ein Rahmen direkt um das Modell entsteht.
Mit der Maus möchte ich die Y-Achse für Links/Rechts und für Oben / Unten werde ich 2 mal die X Achse festlegen. Bei der Y-Achse wird es fast immer die Kupplungshöhe sein und bei der X Achse der jeweilige höchste Punkt und der tiefste Punkt einer Aufnahme sein. Von diesen Startpunkten wird es dann noch einen kleinen Ausgleichsbereich geben, damit auch ein paar Pixel drum herum die Farbe untersucht wird. Stehen dann die Ergebnisse fest, dann soll erst einmal ein Rahmen / Linien angezeigt werden, die mir das Ganze Ergebnis anzeigen.
Bestätige ich nun dieses Ergebnis, dann soll auch nur dieser Bereich als neues Bild abgespeichert werden.
Nur leider bekomme ich das aktuell mit meinem Code nicht so hin.
Da mein jetziger Code nach dem Laden des nicht transparenten Bildes dies direkt umwandelt und abspeichert, muss also die Prüfung der Farbwerte > color.Transparent sein.
Ich hänge jetzt erst einmal meinen aktuellen Code kpl. an. Da gibt es am Ende mit Sicherheit noch optimierungsbedarf, aber erst einmal will ich das Problem gelöst haben bzw. den Grund für meine Schwierigkeiten herausbekommen.
Spoiler anzeigen
Des weiteren noch ein paar Screenshots von dem bisherigen Ergebnissen
Bild1 = Der kleine rote Punkt ist die ungefähre Stelle, an der ich die Y Achse bestimmt habe. Die beiden senkrechten Striche von außen gesehen, sind meine Hilfslinien, die mir das Ergebnis anzeigen. Sie sind also noch sehr weit weg vom Endergebnis.
Bild2 = Auch hier kurz von dem Puffer einen Mausklick gemacht
Testlok.jpg (2032 x 1088 Pixel) = Da ich aus rechtlichen Gründen sicher sein will, habe ich mir eine Lok eh mit CorelDraw selbst gezeichnet und diese genommen. Den Hintergrund habe ich nachträglich mit Paint.Net weiß eingefärbt und als JPG - Datei abgespeichert.
Testwaggon.jpg (2032 x 1088 Pixel) = Hier das gleiche und etwas breiteres Bild
Das schwarze Rechteck oben im blauen Panel soll mir eigentlich die aktuelle Farbe meines Mausklick-Koordinatenpunktes anzeigen. Wir ihr aber seht, ist dort aber kein Schwarz zu sehen. Bei dem Wagen stimmt die Anzeige eigentlich auch nicht.
Ich befürchte, dass hat etwas mit dem Zoomen der Grafik zu tun. Der GetPixel-Befehl greift hier ggf. nicht auf die Anzeige zurück, sondern auf das Bild, welches ohne Zoom entstehen würde. Aber auch dies habe ich mal mit dem Wagenbild getestet (Ergebnis Bild 3, Zeile PictureBox1.SizeMode = PictureBoxSizeMode.Zoom habe ich deaktiviert).
Habt Ihr eine Idee, was ich machen muss, damit mein Bild richtig erkannt wird und dann mit diesem Bereich abgespeichert werden kann?
Bin mal auf Eure Antworten gespannt.
Volker
*Topic verschoben*
aktuell möchte ich Bilder von meinen Modelleisenbahnmodellen transparent machen, in dem ich den weißen Hintergrund entfernen möchte. Klappt aktuell auch schon ganz gut.
Im zweiten Schritt soll nun mein Bild von allen Seiten beschnitten werden, so dass am Ende ein Rahmen direkt um das Modell entsteht.
Mit der Maus möchte ich die Y-Achse für Links/Rechts und für Oben / Unten werde ich 2 mal die X Achse festlegen. Bei der Y-Achse wird es fast immer die Kupplungshöhe sein und bei der X Achse der jeweilige höchste Punkt und der tiefste Punkt einer Aufnahme sein. Von diesen Startpunkten wird es dann noch einen kleinen Ausgleichsbereich geben, damit auch ein paar Pixel drum herum die Farbe untersucht wird. Stehen dann die Ergebnisse fest, dann soll erst einmal ein Rahmen / Linien angezeigt werden, die mir das Ganze Ergebnis anzeigen.
Bestätige ich nun dieses Ergebnis, dann soll auch nur dieser Bereich als neues Bild abgespeichert werden.
Nur leider bekomme ich das aktuell mit meinem Code nicht so hin.
Da mein jetziger Code nach dem Laden des nicht transparenten Bildes dies direkt umwandelt und abspeichert, muss also die Prüfung der Farbwerte > color.Transparent sein.
Ich hänge jetzt erst einmal meinen aktuellen Code kpl. an. Da gibt es am Ende mit Sicherheit noch optimierungsbedarf, aber erst einmal will ich das Problem gelöst haben bzw. den Grund für meine Schwierigkeiten herausbekommen.
VB.NET-Quellcode
- Imports System.Drawing.Imaging
- Imports System.Drawing
- Public Class Form1
- Dim farbe As Color
- Dim mw_farbe As Integer
- Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
- Dim Dateipfad As String
- Dateipfad = "C:\Temp\Testlok.jpg"
- 'Dateipfad = "D:\Temp\Testwagen.jpg"
- PictureBox1.Image = Image.FromFile(Dateipfad)
- PictureBox1.SizeMode = PictureBoxSizeMode.Zoom
- Dim bild As Bitmap = PictureBox1.Image
- Dim Schwelle As Integer = LBl_Schwellenwert.Text ' hier Deinen Wert vorgeben
- For x As Int32 = 0 To bild.Width - 1
- For y As Int32 = 0 To bild.Height - 1
- farbe = bild.GetPixel(x, y)
- mw_farbe = (CInt(farbe.R) + CInt(farbe.G) + CInt(farbe.B)) / 3
- If mw_farbe < Schwelle Then
- bild.SetPixel(x, y, farbe)
- Else
- bild.SetPixel(x, y, Color.Pink)
- End If
- Next
- Next
- ' Transparente Farbe festlegen
- bild.MakeTransparent(System.Drawing.Color.Pink)
- bild = PictureBox1.Image
- 'bild.Save("C:\Temp\Test_Transparent.png", Imaging.ImageFormat.Png) 'Bitmap abspeichern
- 'bild = Nothing 'und aus dem ram werfen, wenn du In der Sub noch was machen willst.
- Dim Pic1 As New Bitmap(PictureBox1.Image, PictureBox1.Width, PictureBox1.Height)
- Dim g As Graphics = Graphics.FromImage(Pic1)
- Pic1.Save("C:\Temp\Test_Transparent.png", System.Drawing.Imaging.ImageFormat.Png)
- Pic1.Dispose()
- End Sub
- Private Sub TrackBar1_Scroll(sender As Object, e As EventArgs) Handles TrackBar1.Scroll
- Me.LBl_Schwellenwert.Text = Me.TrackBar1.Value
- End Sub
- Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
- Me.WindowState = FormWindowState.Maximized
- Me.LBl_Schwellenwert.Text = 235
- Me.TrackBar1.Value = Me.LBl_Schwellenwert.Text
- End Sub
- Private Sub PictureBox1_MouseClick(sender As Object, e As MouseEventArgs) Handles PictureBox1.MouseClick
- Me.LabelX.Text = e.X
- Me.LabelY.Text = e.Y
- Dim Bild As New Bitmap(PictureBox1.Image, PictureBox1.Width, PictureBox1.Height)
- Dim Farbe As Color
- Farbe = Bild.GetPixel(e.X, e.Y - 1)
- LBL_FarbeA.Text = CInt(farbe.A)
- LBL_FarbeR.Text = CInt(farbe.R)
- LBL_FarbeG.Text = CInt(farbe.G)
- LBL_FarbeB.Text = CInt(farbe.B)
- LBL_FarbeRGB.BackColor = Color.FromArgb(LBL_FarbeA.Text, LBL_FarbeR.Text, LBL_FarbeG.Text, LBL_FarbeB.Text)
- End Sub
- Private Sub Btn_Links_Eingrenzen_Click(sender As Object, e As EventArgs) Handles Btn_Links_Eingrenzen.Click
- Dim Bild As New Bitmap(PictureBox1.Image, PictureBox1.Width, PictureBox1.Height)
- Dim Weiter As Boolean = True
- For y As Int32 = CInt(Me.LabelY.Text) - 40 To CInt(Me.LabelY.Text) + 40
- For x As Int32 = 1 To Bild.Width - 1
- Try
- farbe = Bild.GetPixel(x, y)
- Catch ex As Exception
- farbe = Color.White
- Bild.SetPixel(x, y, Color.Pink)
- End Try
- mw_farbe = (CInt(farbe.A) + CInt(farbe.R) + CInt(farbe.G) + CInt(farbe.B)) / 3
- Label1.Text = mw_farbe
- If mw_farbe > 0 Then
- Dim g As System.Drawing.Graphics
- Dim pen1 As New System.Drawing.Pen(Color.Black, 3)
- g = PictureBox1.CreateGraphics
- x = x - 7
- g.DrawLine(pen1, x, 10, x, PictureBox1.Height - 10)
- Weiter = False
- Exit For
- Else
- End If
- Bild.SetPixel(x, y, Color.Red)
- Next x
- If Weiter = False Then
- Exit For
- End If
- Next y
- End Sub
- Private Sub Btn_Rechts_Eingrenzen_Click(sender As Object, e As EventArgs) Handles Btn_Rechts_Eingrenzen.Click
- Dim Bild As New Bitmap(PictureBox1.Image, PictureBox1.Width, PictureBox1.Height)
- Dim Weiter As Boolean = True
- For y As Int32 = CInt(Me.LabelY.Text) - 40 To CInt(Me.LabelY.Text) + 40
- For x As Int32 = Bild.Width - 1 To 1 Step -1
- Try
- farbe = Bild.GetPixel(x, y)
- Catch ex As Exception
- farbe = Color.White
- Bild.SetPixel(x, y, Color.Pink)
- End Try
- mw_farbe = (CInt(farbe.R) + CInt(farbe.G) + CInt(farbe.B)) / 3
- Label1.Text = mw_farbe
- If mw_farbe > 0 Then
- Dim g As System.Drawing.Graphics
- Dim pen1 As New System.Drawing.Pen(Color.Black, 3)
- g = PictureBox1.CreateGraphics
- x = x - 7
- g.DrawLine(pen1, x, 10, x, PictureBox1.Height - 10)
- Weiter = False
- Exit For
- End If
- Next x
- If Weiter = False Then
- Exit For
- End If
- Next y
- End Sub
- Private Sub Btn_Oben_Eingrenzen_Click(sender As Object, e As EventArgs) Handles Btn_Oben_Eingrenzen.Click
- Dim Bild As New Bitmap(PictureBox1.Image, PictureBox1.Width, PictureBox1.Height)
- Dim Weiter As Boolean = True
- For x As Int32 = CInt(Me.LabelX.Text) - 20 To CInt(Me.LabelX.Text) + 20
- For y As Int32 = CInt(Me.LabelY.Text) To Bild.Height - 1
- Try
- farbe = Bild.GetPixel(x, y)
- Catch ex As Exception
- farbe = Color.White
- Bild.SetPixel(x, y, Color.Pink)
- End Try
- mw_farbe = (CInt(farbe.R) + CInt(farbe.G) + CInt(farbe.B)) / 3
- Label1.Text = mw_farbe
- If mw_farbe > 0 Then
- Dim g As System.Drawing.Graphics
- Dim pen1 As New System.Drawing.Pen(Color.Black, 3)
- g = PictureBox1.CreateGraphics
- g.DrawLine(pen1, 10, y, PictureBox1.Width - 10, y)
- Weiter = False
- Exit For
- End If
- Next y
- If Weiter = False Then
- Exit For
- End If
- Next x
- End Sub
- Private Sub Btn_Unten_Eingrenzen_Click(sender As Object, e As EventArgs) Handles Btn_Unten_Eingrenzen.Click
- End Sub
- End Class
Des weiteren noch ein paar Screenshots von dem bisherigen Ergebnissen
Bild1 = Der kleine rote Punkt ist die ungefähre Stelle, an der ich die Y Achse bestimmt habe. Die beiden senkrechten Striche von außen gesehen, sind meine Hilfslinien, die mir das Ergebnis anzeigen. Sie sind also noch sehr weit weg vom Endergebnis.
Bild2 = Auch hier kurz von dem Puffer einen Mausklick gemacht
Testlok.jpg (2032 x 1088 Pixel) = Da ich aus rechtlichen Gründen sicher sein will, habe ich mir eine Lok eh mit CorelDraw selbst gezeichnet und diese genommen. Den Hintergrund habe ich nachträglich mit Paint.Net weiß eingefärbt und als JPG - Datei abgespeichert.
Testwaggon.jpg (2032 x 1088 Pixel) = Hier das gleiche und etwas breiteres Bild
Das schwarze Rechteck oben im blauen Panel soll mir eigentlich die aktuelle Farbe meines Mausklick-Koordinatenpunktes anzeigen. Wir ihr aber seht, ist dort aber kein Schwarz zu sehen. Bei dem Wagen stimmt die Anzeige eigentlich auch nicht.
Ich befürchte, dass hat etwas mit dem Zoomen der Grafik zu tun. Der GetPixel-Befehl greift hier ggf. nicht auf die Anzeige zurück, sondern auf das Bild, welches ohne Zoom entstehen würde. Aber auch dies habe ich mal mit dem Wagenbild getestet (Ergebnis Bild 3, Zeile PictureBox1.SizeMode = PictureBoxSizeMode.Zoom habe ich deaktiviert).
Habt Ihr eine Idee, was ich machen muss, damit mein Bild richtig erkannt wird und dann mit diesem Bereich abgespeichert werden kann?
Bin mal auf Eure Antworten gespannt.
Volker
*Topic verschoben*
Dieser Beitrag wurde bereits 3 mal editiert, zuletzt von „Marcus Gräfe“ ()