Pinsel mit anpassung der Größe & Deckkraft

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

Es gibt 15 Antworten in diesem Thema. Der letzte Beitrag () ist von SidezockingLP.

    Pinsel mit anpassung der Größe & Deckkraft

    Hey,

    Ich hätte mal wieder eine Frage an euch. Folgendes

    Ich möchte einen Pinsel erstellen der Pixel einfärbt. Allerdings wird beim zoomen des Bildes aus einem Pixel ja mehrere. Hat jemand eine Idee wie ich dann bei einem Mouse Click alle Pixel einfärbe die nach dem vergrößern zu diesem einen Pixel gehören? Bzw ein Rechteck erstellen dass um diesen Pixel geht.

    Hoffe es versteht jemand =O

    Auch frage ich mich, gibt es bei der Rechteck füllung auch eine Deckkraft also opacity ?

    Grüße
    @SidezockingLP Da musst Du Dir zu jeder Zoom-Stufe wohl einen neuen entsprechend großen Pinsel erstellen.
    Was verstehst Du unter Rechteck füllung?
    Wäre da ein Kreis (Ellipse) nicht die bessere Pinselform?
    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!
    Hey @RodFromGermany
    Ich hab da einfach ein großes Logigproblem. Ich möchte wenn ich auf einen Pixel im ZoomBild einen Mausklick mache das mir eine funktion den Bereich ausgibt der den Orginalen Pixel darstellt

    Also 2Pixel werden mit dem zoomfactor 10 zu 20 Pixeln. Klicke ich den 18 Pixel soll er mir sagen dass der Ursprüngliche Pixel jetzt von 10 - 20 geht damit ich alles neu einfärben kann

    Bisschen hab ich es probiert, diese Funktion gibt immer ein bisschen zu viel aus:

    VB.NET-Quellcode

    1. Dim bildposX As Integer = Get_Img_position_x(e.X)
    2. Dim bildposY As Integer = Get_Img_position_y(e.Y)
    3. Dim streckung_ruck_x As Single = bildposX / (akt_zoom / 100)
    4. Dim teile_x As Integer = Pic.Image.Width / (Pic.Image.Width / (akt_zoom / 100))
    5. Dim rechteck_x As Integer = teile_x * Math.Round(streckung_ruck_x, 0)
    6. Debug.Print(rechteck_x)


    Irgendwie logisch was ich will? Hoffe ihr könnt mir helfen

    Grüße
    @SidezockingLP Dann solltest Du einfach beim Click die realen Click-Pixel in gezoomte Pixel umrechnen und mit denen weiterrechnen:

    VB.NET-Quellcode

    1. Dim x2 = e.X \ Zoomfactor
    2. Dim y2 = e.Y \ Zoomfactor
    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!
    @RodFromGermany

    Ok habe probiert das umzusetzen. Ursprüngliche Koords ausrechnen, Rechteck um den Pixel Zeichnen und dann vergrößern. Funzt leider noch nicht ganz(siehe Bilder), das Rechteck wird 4 Pixel groß, soll aber nur 1pixel groß werden. Wo liegt denn mein Fehler im Code? Pinselgröße ist 1:

    VB.NET-Quellcode

    1. Private Sub Pic_MouseClick(sender As Object, e As MouseEventArgs) Handles Pic.MouseClick
    2. If Stift.BorderStyle = BorderStyle.Fixed3D Then
    3. If ist_in_img(e.X, e.Y) = True Then
    4. Dim bildposX As Integer = Get_Img_position_x(e.X)
    5. Dim bildposY As Integer = Get_Img_position_y(e.Y)
    6. Dim Pixel As Integer = Math.Round(Get_Img_position_x(e.X) / (akt_zoom / 100), 0)
    7. Dim oImage As New Bitmap(original.Width, original.Height)
    8. Using gr As Graphics = Graphics.FromImage(oImage)
    9. gr.DrawImage(original, New Rectangle(0, 0, original.Width, original.Height))
    10. gr.DrawRectangle(Pens.Red, CInt(Math.Round(bildposX / (akt_zoom / 100), 0)), CInt(Math.Round(bildposY / (akt_zoom / 100), 0)), get_pinsel_größe(), get_pinsel_größe())
    11. End Using
    12. Pic.Image = Nothing 'Display PicBox
    13. Pic.Image = oImage
    14. original = oImage
    15. ZoomImage(akt_zoom)
    16. End If
    17. End If
    18. End Sub


    Noch ne Frage, könnte man nur Ränder des Rechtecks zeigen?

    LG
    Bilder
    • danach.PNG

      11,69 kB, 1.100×484, 252 mal angesehen
    • vor.PNG

      12,06 kB, 1.099×496, 132 mal angesehen
    @SidezockingLP Poste mal so viel Code, dass er sich kompilieren lässt (teste dies!).
    Graphics.DrawRectangle(...) vs. Graphics.FillRectangle(...)
    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!

    SidezockingLP schrieb:

    nur farbig umranden?
    mit Graphics.DrawRectangle().

    VB.NET-Quellcode

    1. Private Sub Form1_Paint(sender As Object, e As PaintEventArgs) Handles MyBase.Paint
    2. e.Graphics.DrawRectangle(Pens.Red, New Rectangle(10, 10, 100, 100))
    3. e.Graphics.FillRectangle(Brushes.Blue, New Rectangle(15, 15, 90, 90))
    4. End Sub
    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!

    SidezockingLP schrieb:

    was muss ich denn da ändern?
    Poste mal den relevanten Code.
    Mit dem ganzen gezoome.
    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!
    Hey @RodFromGermany

    Gibt es, oder kennst du eine Möglichkeit, wie man der Füllung eine Rectangles eine Deckkraft geben kann? Also Deckkraft meint bei 50% Deckkraft ist die Farbe halbtransparent, also quasi gleich opacity 50%

    LG
    @SidezockingLP Das wäre die A-Komponente der Color: Dim col = New Color(A, R, G, B)
    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!
    Ich nehme mal an damit willst du die zuvor gezoomte grafik bearbeiten?
    Ich halte es für sinnvoller ein transparentes bild selber größe darüber zu zeichnen und dort die einzelnen pixel zu setzen.
    Das macht es auch einfach sich eine liste von Bearbeitungen zu speichern und entsprechend auch Undo/Redo zu implementieren. Ebenso wie das einfache abspeichern am ende.
    Andere Möglichkeit ist natürlich direkt das bild zu bearbeiten, aber du musst dabei immer eine Kopie vom Original behalten...
    Ich wollte auch mal ne total überflüssige Signatur:
    ---Leer---
    @jvbsl Jou.
    @SidezockingLP Du kommst hier mit vielen Einzelproblemen.
    Kannst Du vielleicht mal das Gesamtproblem / die Aufgabenstellung darlegen?
    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!
    @jvbsl Stimmt eig :huh: Habs tatsächlich momentan so: ​Andere Möglichkeit ist natürlich direkt das bild zu bearbeiten, aber du musst dabei immer eine Kopie vom Original behalten...
    @RodFromGermany Jo die vielen Einzelprobleme deshalb weil ich mit dem Thema vorher nichts am Hut hatte und dass jetzt nach und nach lerne.
    Alle Probleme die bisher aufkamen sind gelöst worden .

    LG