Farben aus bitmap ziehen

  • VB.NET

Es gibt 12 Antworten in diesem Thema. Der letzte Beitrag () ist von 00yoshi.

    Guck dir mal die Funktionen GetPixel und SetPixel an. GetPixel gibt ein Color-Objekt zurück, dessen Eigenschaften kannst du verändern (wie z.B. [ColorObjekt].R = 0). Danach weist du dem Pixel seine neue Farbe zu.

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Rinecamo“ ()

    Eventuell sollte man sich LockBits anschauen. Damit geht's wesentlich schneller, als mit GetPixel und SetPixel.
    Aber bei ganz kleinen Bitmaps geht's auch so.
    "Luckily luh... luckily it wasn't poi-"
    -- Brady in Wonderland, 23. Februar 2015, 1:56
    Desktop Pinner | ApplicationSettings | OnUtils

    VB.NET-Quellcode

    1. Dim bmp As Bitmap = leaves
    2. Dim a As Integer
    3. Dim b As Integer
    4. For i As Integer = 0 To 16
    5. Dim c As Color = bmp.GetPixel(a, b)
    6. Dim r1 As Integer
    7. Dim r2 As Integer
    8. Dim r3 As Integer
    9. r1 = c.R
    10. r2 = c.G * 256
    11. r3 = c.B
    12. Dim c2 As Color = Color.FromArgb(r2 + -16777216)
    13. bmp.SetPixel(a, b, c2)
    14. If a > 15 Then
    15. b += 1
    16. a = 0
    17. End If
    18. a += 1
    19. Next i


    Geht nicht: a geht von 0 - 16 dann geht es einfach weiter ins pr.
    @00yoshi: Ich hab da ein paar Fragen zu Deinem Codeschnipsel.

    Was möchtest Du mit a, b und i erreichen? Wenn Du jedes Pixel durchgehen willst, sind zwei verschachtelte Schleifen sinnvoll:

    VB.NET-Quellcode

    1. For Y = 0 To 15
    2. For X = 0 To 15
    3. '...
    4. Next
    5. Next


    Warum deklarierst Du so viele/umständlich Variablen?
    Deklaration und Zuweisung kann man in eine Zeile schreiben. Überhaupt brauchst Du die ganzen r-Variablen nicht, weil Du sie nur genau einmal verwendest (und weil es nicht der Übersichtlichkeit dient)

    Warum multiplizierst Du die Grüne Komponente mit 256? Was soll das bewirken?

    Was erwartest Du Dir von Color.FromArgb(r2 + -16777216)?
    Was soll -16777216 sein? Und was soll es bewirken, das von r2 abzuziehen? Und warum verwendest Du nur r2 und wo bleiben r1 und r3?
    "Luckily luh... luckily it wasn't poi-"
    -- Brady in Wonderland, 23. Februar 2015, 1:56
    Desktop Pinner | ApplicationSettings | OnUtils
    Auch wenn ich mich mit Farbmatrizen nicht gut auskenne, hört sich das nach einem Anwendungsfall dafür an. Hier gibt es ein nützliches Flash-Applet, in dem man mit der Matrix ein wenig spielen kann. quasimondo.com/archives/000565.php

    Die passende Matrix, um den Rot-Wert zu entfernen, müsste so aussehen:

    VB.NET-Quellcode

    1. Dim matrixItems As Single()() = {New Single() {0, 0, 0, 0, 0},
    2. New Single() {0, 1, 0, 0, 0},
    3. New Single() {0, 0, 1, 0, 0},
    4. New Single() {0, 0, 0, 1, 0},
    5. New Single() {1, 1, 1, 1, 1}}
    6. Dim colorMatrix As New ColorMatrix(matrixItems)
    7. Dim imgAttr As New ImageAttributes()
    8. imgAttr.SetColorMatrix(colorMatrix, ColorMatrixFlag.Default, ColorAdjustType.Bitmap)
    Nun musst du deine Bitmap mit graphics.DrawImage unter Verwendung von imgAttr als Parameter zeichnen.

    Skybird schrieb:

    Das sind ja Ubisoftmethoden hier !

    VB.NET-Quellcode

    1. Dim bmp As Bitmap = leaves
    2. For x As Integer = 0 To 16
    3. For y As Integer = 0 To 16
    4. Dim col As Color = bmp.GetPixel(x, y)
    5. Dim r2 As Integer = col.G
    6. Dim col2 As Color = Color.FromArgb(r2 + -16777216)
    7. bmp.SetPixel(x, y, col2)
    8. Next y
    9. Next x
    10. PictureBox1.Image = bmp

    leaves ist my.resources.leaves
    Fehler: picturebox1 ist dann leer.
    -16777216 ist der alpha-wert 255.
    Es soll rot und grün rausziehen.
    Und der tipp mit den verschachtelten schleifen ist auch gut. thx.

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „00yoshi“ ()

    Gib mal die Zahl als Hexzahl aus:

    VB.NET-Quellcode

    1. Dim value As Integer = Color.Bisque.ToArgb
    2. MessageBox.Show(value.ToString("X8"))
    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!
    so ist der code jetzt: (leaves ist 16*16)

    VB.NET-Quellcode

    1. Dim bmp As Bitmap = leaves
    2. For x As Integer = 0 To 15
    3. For y As Integer = 0 To 15
    4. Dim col As Color = bmp.GetPixel(x, y)
    5. Dim r2 As Integer = col.G
    6. Dim a As Integer = col.A
    7. Dim col2 As Color = Color.FromArgb(RGB(0, r2, 0) + -16777216)
    8. bmp.SetPixel(x, y, col2)
    9. Next y
    10. Next x
    11. PictureBox1.Image = bmp

    00yoshi schrieb:

    VB.NET-Quellcode

    1. Dim col2 As Color = Color.FromArgb(RGB(0, r2, 0) + -16777216)
    What?

    VB.NET-Quellcode

    1. Dim col2 As Color = Color.FromArgb(0, r2, 0)
    tut dasselbe.
    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!