GDI Transparente Maske für Bitmap erstellen.

  • C#
  • .NET (FX) 4.5–4.8

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

    GDI Transparente Maske für Bitmap erstellen.

    Hallo, ich versuche gerade anhand einer Grafik (Im Anhang) eine Maske für ein Bitmap zu erstellen. Die Maske soll Praktisch aus den einzelnen Graustufen erzeugt werden. Eventuell hat ja jemand von euch einen Ansatz, hab ewig google genutzt aber leider nichts gefunden.
    Bilder
    • Pencil.png

      55,45 kB, 512×512, 64 mal angesehen
    Meine Projekte Genesis Game Engine | GFX | smartli.me - Der smarte URL shortener

    @Andy Wie ist Dein bisheriger Code?
    Wie gedenkst Du diese Maske anzuwenden?
    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!
    Nur, damit ich Dich völlig falsch verstehe: Hast Du zwei Bitmaps mit gleichen Dimensionen, wobei das gezeigte die Transparenz von Bitmap 1 darstellen soll und schwarz = durchsichtig und weiß = undurchsichtig? Und Du willst das per Code machen, nicht per Bildbearbeitung? (Denn z.B. in Paint.NET kann sowas in weniger als einer Minute machen, denn dafür gibt's dort ein eigenes Tool)
    Dann mach es mit z.B. (Such-Stichwort) LockBits.
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.
    Hi

    k.A. ob Du so etwas suchst. Du könntest dafür eine ColorMatrix verwenden. Also so wie Dein Grayscale-Bild ist, entsteht in der mitte ein schwarzes Loch und zum Rand hin wird das Grayscale-Bild transparenter auf das zweite Bild gezeichnet.
    Spoiler anzeigen

    VB.NET-Quellcode

    1. Option Strict On
    2. Option Explicit On
    3. Imports System.Drawing.Imaging
    4. Public Class Form1
    5. Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    6. Dim bmp As New Bitmap("D:\Image.jpg")
    7. Using gsBmp As New Bitmap("D:\Grayscale.png")
    8. Dim matrixItems As Single()() = {New Single() {0, 0, 0, 1, 0},
    9. New Single() {0, 0, 0, 1, 0},
    10. New Single() {0, 0, 0, 1, 0},
    11. New Single() {0, 0, 0, 0, 0},
    12. New Single() {0, 0, 0, 0, 0}}
    13. Using imageAtt As New ImageAttributes()
    14. Dim colorMatrix As New ColorMatrix(matrixItems)
    15. imageAtt.SetColorMatrix(colorMatrix, ColorMatrixFlag.Default,
    16. ColorAdjustType.Bitmap)
    17. Using gr As Graphics = Graphics.FromImage(bmp)
    18. gr.DrawImage(gsBmp, New Rectangle(0, 0, gsBmp.Width, gsBmp.Height),
    19. 0, 0, gsBmp.Height, gsBmp.Height, GraphicsUnit.Pixel,
    20. imageAtt)
    21. End Using
    22. End Using
    23. End Using
    24. PictureBox1.Image = bmp
    25. End Sub
    26. End Class



    Wenn Du Dein Grayscale-Bild also umdrehst, also in der mitte Schwarz und nach außen hin wird es weiß, wird der Effekt umgedreht. Du kannst dann den Effekt auch ein wenig in der ColorMatrix steuern (auf- oder zuziehen).

    VB.NET-Quellcode

    1. Dim matrixItems As Single()() = {New Single() {0, 0, 0, 1, 0},
    2. New Single() {0, 0, 0, 1, 0},
    3. New Single() {0, 0, 0, 1, 0},
    4. New Single() {0, 0, 0, 0, 0},
    5. New Single() {0, 0, 0, -1.5, 0}} ' <- vorletzter Parameter in dieser Zeile
    Mfg -Franky-

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

    Hallo, Ziel des ganzen soll sein, dass ich einen "Layer" erstelle und diesen mit einer Textur die sich wiederholt fülle. Danach soll praktisch eine Maske darüber gelegt werden und anhand der Graustuffen die bereiche der Schwarzen Fläche transparent werden. Ich würde gern so eine Textur "malen".
    Meine Projekte Genesis Game Engine | GFX | smartli.me - Der smarte URL shortener

    Hi

    Also, der gesamte Layer mit der sich wiederholenden Textur soll entsprechend des Graustufenbildes transparent gemacht werden? So richtig? Zunächst müsstest alle Layer (Bilder) und das Graustufenbild in das 32bppARGB Pixelformat konvertieren. Macht das ganze einfacher wegen der Berechnung der Pixelposition und der Transparenz. Dein Graustufenbild müsstest auf die Größe vom entsprechenden Layer mit der Textur skalieren. Dann gehst per LockBits und einer Schleife durch die Pixel des Graustufenbildes und des Layers mit der Textur. Pixel vom Graustufenbild und vom Layer auslesen, Transparenz vom Graustufenbild berechnen (zB. (r+g+b)/3 oder auch per Color.GetBrightness * 255), diesen berechneten Wert für den Pixel des Layers mit der Textur für den Alpha-Channel setzen.
    Mfg -Franky-