Bitmap: Alles was nicht Transparent ist, einfärben

  • VB.NET

Es gibt 5 Antworten in diesem Thema. Der letzte Beitrag () ist von VaporiZed.

    Bitmap: Alles was nicht Transparent ist, einfärben

    Hallo,

    wie färbe ich alles was nicht transparent in einer Bitmap ist ein?
    Ob etwas transparent ist, oder nicht lässt sich leicht über Color.ARGB herausfinden, wenn man den Alphakanal auf 0 stellt.

    Aber wie würdet ihr mein Problem angehen?
    Es muss wohl jedes Pixel einzeln durchgegangen werden, überprüft werden ob es transparent ist und wenn nicht mit Farbe X gefüllt werden oder?

    VG

    P.S: habe mir folgendes zusammengeschrieben. Habt ihr eine Idee wie man das ganze noch beschleunigen könnte (es sind leider große Bilder):

    VB.NET-Quellcode

    1. For y = 0 To NewBitmap.Height - 1
    2. For x = 0 To NewBitmap.Width - 1
    3. If Not NewBitmap.GetPixel(x, y) = Color.FromArgb(0, 0, 0, 0) Then 'Wenn nicht Transparent, dann:
    4. NewBitmap.SetPixel(x, y, NewColor) 'Neu einfärben
    5. End If
    6. Next
    7. Next


    Entfernten Code wiederhergestellt. ~Thunderbolt

    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „Thunderbolt“ ()

    Stichwort LockBits/UnlockBits. Da bekommst Du dann ein großes Array mit all Deinen Farbwerten, die Du dann durchwandern und manipulieren kannst. Ist deutlich schneller als mit SetPixel zu arbeiten.
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Häufig von mir verwendete Abkürzungen: CEs = control elements (Labels, Buttons, DGVs, ...) und tDS (typisiertes DataSet)
    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht in den Spekulatiusmodus gehen.
    Jemand eine Ahnung wieso sich nichts ändert? :(

    VB.NET-Quellcode

    1. ublic Function ChangePixelColor(ByVal bmp As Bitmap, ByVal mode As String)
    2. Dim rect As New Rectangle(0, 0, bmp.Width, bmp.Height)
    3. Dim bmpData As System.Drawing.Imaging.BitmapData = bmp.LockBits(rect,
    4. Drawing.Imaging.ImageLockMode.ReadWrite, bmp.PixelFormat)
    5. Dim ptr As IntPtr = bmpData.Scan0
    6. Dim bytes As Integer = Math.Abs(bmpData.Stride) * bmp.Height
    7. Dim rgbValues(bytes - 1) As Byte
    8. System.Runtime.InteropServices.Marshal.Copy(ptr, rgbValues, 0, bytes)
    9. For counter As Integer = 0 To rgbValues.Length - 4 Step 4
    10. If Not rgbValues(counter + 0) = 0 And rgbValues(counter + 1) = 0 And rgbValues(counter + 2) = 0 And rgbValues(counter + 3) = 0 Then 'Wenn nicht transparent, dann:
    11. rgbValues(counter + 0) = 255 'B
    12. rgbValues(counter + 1) = 0 'G
    13. rgbValues(counter + 2) = 0 'R
    14. rgbValues(counter + 3) = 255 'A
    15. End If
    16. Next
    17. Runtime.InteropServices.Marshal.Copy(rgbValues, 0, ptr, bytes)
    18. ' Unlock
    19. bmp.UnlockBits(bmpData)
    20. Return bmp
    21. bmp.Dispose()
    22. Runtime.InteropServices.Marshal.CleanupUnusedObjectsInCurrentContext()
    23. End Function


    Entfernten Code wiederhergestellt. ~Thunderbolt

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „Thunderbolt“ ()

    1. Zeile#15 ist ggf. inhaltlich falsch. Da schreibst Du: Wenn das Pixel zumindest etwas Blau, aber kein bisschen von den anderen Farben hat, dann. Ist das gewollt?
    Die Zeilen#30 und #31 werden niemals ausgeführt, weil vorher Z#28 die Function verlässt.
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Häufig von mir verwendete Abkürzungen: CEs = control elements (Labels, Buttons, DGVs, ...) und tDS (typisiertes DataSet)
    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht in den Spekulatiusmodus gehen.
    Vielen vielen Dank dir!
    Habs ganz einfach:

    VB.NET-Quellcode

    1. If Not rgbValues(counter + 3) = 0 Then

    Die anderen Werte kann man ja vernachlässigen wenn es nur um Transparenz geht

    VaporiZed schrieb:

    Die Zeilen#30 und #31 werden niemals ausgeführt, weil vorher Z#28 die Function verlässt.
    Wie kann ich dann ordentlich die Bitmap disposen? Kann das ja nicht vor Return ziehen, da sonst eine leere Bitmap returned wird, oder?

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

    Warum willst Du die Bitmap disposen, die Du der Function übergibst? Die aufrufende (oder eine noch höhere) Prozedur hat sie erstellt, also sie die auch dafür verantwortlich, dass die Bitmap disposed wird. Die ChangePixelColor-Function sollte sie jedenfalls nicht disposen. Und Zeile#31 passt m.E. inhaltlich sehr gut in Z#27. Ich hab zwar keine Ahnung, ob es diesen Aufruf braucht, aber das ist eine andere Geschichte.
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Häufig von mir verwendete Abkürzungen: CEs = control elements (Labels, Buttons, DGVs, ...) und tDS (typisiertes DataSet)
    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht in den Spekulatiusmodus gehen.