argb werden verfälscht gezeichnet

  • VB.NET

Es gibt 6 Antworten in diesem Thema. Der letzte Beitrag () ist von Steppenpferd.

    argb werden verfälscht gezeichnet

    Habe mich vor ein paar Tagen dazu entschieden, einem bereits älteren Programm, einen kleinen Image-Editor zu Spendieren.
    Soweit kein Problem bis ich die im Editor verwendet Farbe per MouseOver in der Farbpalette markieren wollte.
    Die Farbe, die im Editor mit FillRectangle gezeichnet wurde, entspricht nicht der Farbe die ich im Brush verwendet habe.
    Die Farben werden also verfälscht gezeichnet.
    Der Alphawert der Farben scheint bisher ohne verfälschungen übernommen zu werden, die RGB-werte jedoch nicht.
    Die Farben lese ich aus der gezeichneten Bitmap per GetPixel aus.
    habe bereits alle Möglichen wie CompositingQuality & Co getestet, läuft aber alles aufs gleiche hinaus.

    Beispiel:
    Zeichne ich mit diesem Brush: New Drawing.SolidBrush(Color.FromArgb(28, 255, 255, 255)
    Liefert mir GetPixel: Argb(28,254,254,254)

    Hat jemand eine Idee woran das liegt?
    Das Chaos beginnt mit komprimierter Ordnung (Steppenpferd 2019)
    @Steppenpferd Kläre mal auf, welches Pixelformat diese Bitmaps haben: docs.microsoft.com/de-de/dotne…t?view=netframework-4.7.2
    Kannst Du als Property der Bitmap-Instanz abfragen.
    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!
    @Steppenpferd Kannst Du das Projekt als ZIP, ohne bin- und obj-Verzeichnisse posten?
    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!
    Hatte dafür ein Testprojekt erstellt mit dem ich alle Einstellungen abgeklappert hab.

    VB.NET-Quellcode

    1. 'benötigte steuerelemente für Form1 : PictureBox1
    2. Option Explicit On
    3. Option Strict On
    4. Public Class Form1
    5. Dim pf As System.Drawing.Imaging.PixelFormat = Imaging.PixelFormat.Format32bppArgb
    6. Dim bm As Bitmap = New Bitmap(200, 20, pf)
    7. Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
    8. Dim sBrush As SolidBrush
    9. Me.BackColor = Color.Black
    10. Me.ClientSize = New Size(320, 20)
    11. Me.CenterToScreen()
    12. PictureBox1.Location = New Point(0, 0)
    13. PictureBox1.SizeMode = PictureBoxSizeMode.AutoSize
    14. PictureBox1.Image = bm
    15. Using g As Graphics = Graphics.FromImage(bm)
    16. g.CompositingMode = Drawing2D.CompositingMode.SourceCopy
    17. g.SmoothingMode = Drawing2D.SmoothingMode.None
    18. g.CompositingQuality = Drawing2D.CompositingQuality.HighQuality
    19. g.InterpolationMode = Drawing2D.InterpolationMode.High
    20. g.Clear(Color.Transparent)
    21. For i As Integer = 0 To 9
    22. sBrush = New Drawing.SolidBrush(Color.FromArgb(i * 28, 255, 255, 255))
    23. g.FillRectangle(sBrush, New Rectangle(i * 20, 0, 20, 20))
    24. Next
    25. End Using
    26. End Sub
    27. Private Sub PictureBox1_MouseMove(sender As Object, e As MouseEventArgs) Handles PictureBox1.MouseMove
    28. Me.Text = bm.GetPixel(e.X, e.Y).ToString
    29. End Sub
    30. End Class
    Das Chaos beginnt mit komprimierter Ordnung (Steppenpferd 2019)
    @Steppenpferd Merkwürdig.
    Das kann aber daran liegen, dass Du mit einem A-Grau-Keil arbeitest.
    Mit diesem Code funktioniert es:

    VB.NET-Quellcode

    1. For i As Integer = 0 To 9
    2. 'sBrush = New Drawing.SolidBrush(Color.FromArgb(i * 28, 255, 255, 255))
    3. sBrush = New Drawing.SolidBrush(Color.FromArgb(i * 28, i * 28, i * 28))
    4. g.FillRectangle(sBrush, New Rectangle(i * 20, 0, 20, 20))
    5. Next
    Nach dem Speichern Deiner ursprünglichen Bitmap

    VB.NET-Quellcode

    1. bm.Save("c:\temp\Test.png", System.Drawing.Imaging.ImageFormat.Png)
    kommt da noch was gang anderes raus:
    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 ja das geht weil Du ohne Alpha-Channel zeichnest und deshalb sieht die gespeicherte Bitmap nach dem neu laden bestimmt nochmal anders aus.
    Ich hab da noch was im Hinterstübchen das es beim Alpha-Channel ein schwelle von 0-127 & 128-255 gab. Aber keine Ahnung mehr in welchem Zusammenhang das stand.
    Das Chaos beginnt mit komprimierter Ordnung (Steppenpferd 2019)