aicher1998
Goto Top

VB.Net HeatMap erstellen

Hallo!

Ich suche nach einer Möglichkeit, eine Heatmap zu erstellen (blau bis rot).
Ich kann halb transparente Kreise zeichnen. Wenn sich diese überlagern, dann überdecken die sich:

so zum beispiel

Jetzt ist es aber so, dass die sich nicht überdecken dürfen, in der Schnittmenge muss die Farbe genauso rot sein wie in den Kreisen.

Noch dazu müssten sich die Farbwerte so vermischen können, dass wenn ein blauer Kreis auf einen roten gezeichnet wird, sich die Farbwerte vermischen. Und die Durchlässigkeit darf auch nicht weniger werden!

Gibt es da eine simple Funktion oder werde ich die Kreise mit einer eigenen Funktion zeichnen müssen (Pixel für Pixel) ?

EDIT Es sieht so aus, als werde ich mir die FillEllipse selbst implementieren müssen, gut dass das Framework open source ist

Für eure Tipps bin ich sehr dankbar!

Mit freundlichen Grüßen,
Aicher

Content-Key: 304784

Url: https://administrator.de/contentid/304784

Ausgedruckt am: 19.03.2024 um 08:03 Uhr

Mitglied: Snowman25
Snowman25 19.05.2016 um 12:17:24 Uhr
Goto Top
Hallo @Aicher1998,

Anscheinend kennst du dich mit .NET und Bildmanipulation recht gut aus (Zumindest mehr als ich).
Hier ein Denkanstoß, der dir helfen könnte:

  1. Du erstellst ein neues Bild in der gleichen Dimension wie dein Original, aber mit transparentem Hintergrund.
  2. Auf das neue Bild machst du deine Kreise. Und zwar:
    1. Zuerst die Roten, 100% deckend
    2. Dann machst du das Bild so transparent, wie du es brauchst.
    3. Dann fügst du die blauen Kreise hinzu, und zwar bereits mit der passenen Transparenz, sodass sich dort die Farben überlagern und mischen können.
  3. Schlussendlich packst du deine Marker-maske (das neue Bild) über das alte, mit 100% Deckkraft.

Dadurch solltest du ein Bild erhalten, dass all deine spezifischen Anforderungen erfüllt.

Gruß,
@Snowman25
Mitglied: Aicher1998
Aicher1998 19.05.2016 aktualisiert um 15:03:19 Uhr
Goto Top
Danke!

So geht es leider nicht.

Es sieht so aus, als werde ich mir die FillEllipse selbst implementieren müssen, gut dass das Framework open source ist, dann kann ich das einfacher bearbeiten
Mitglied: atze187
Lösung atze187 01.06.2016, aktualisiert am 02.06.2016 um 08:08:15 Uhr
Goto Top
Hallo Aicher,

alles was geschrieben hab ist natürlich in deinem Fall völliger Quatsch. Sorry, mein Fehler. Bis auf das selber implementieren, dass musst du trotzdem nicht machen. Für deinen Anwendungsfall wäre es folgender Code:

        Dim background As Image = New Bitmap(PictureBox1.Width, PictureBox1.Height)
        Dim overlay As Image = New Bitmap(PictureBox1.Width, PictureBox1.Height)

        Dim gBackground As Graphics = Graphics.FromImage(background)

        Dim cellSize As Integer = Math.Ceiling(background.Width / 50)
        Dim dark As Boolean = True

        For col = 0 To Math.Ceiling(background.Width / cellSize)-1
            For row =0 To Math.Ceiling(background.Height/ cellSize)-1
                dark = (col Mod 2 = 0 And row Mod 2  = 1 ) Or (col Mod 2 = 1 And row Mod 2 = 0)
                if dark  = True Then
                    gBackground.FillRectangle(Brushes.Black, New Rectangle(col*cellSize, row*cellSize, cellSize, cellSize))
                Else
                    gBackground.FillRectangle(Brushes.White, New Rectangle(col * cellSize, row * cellSize, cellSize, cellSize))
                End If
            Next
        Next

        Dim radius As Integer = 50

        Dim points As List(Of Point) = New List(Of Point)
        Dim rnd = New Random()

        For index = 1 To 100
            points.Add(New Point(rnd.Next(radius, PictureBox1.Width - radius), rnd.Next(radius, PictureBox1.Height - radius)))
        Next

        Dim g As Graphics = Graphics.FromImage(overlay)
        g.Clear(Color.Transparent)


        For Each point In points
            g.FillEllipse(Brushes.Red, point.X-radius, point.Y-radius, radius*2, radius*2)
        Next

        Dim colormatrix As new ColorMatrix()
        colormatrix.Matrix33 = 0.5
        Dim imgAttribute as new ImageAttributes()
        imgAttribute.SetColorMatrix(colormatrix, ColorMatrixFlag.Default, ColorAdjustType.Bitmap)

        gBackground.DrawImage(overlay, new Rectangle(0, 0, overlay.Width, overlay.Height), 0, 0, overlay.Width, overlay.Height, GraphicsUnit.Pixel, imgAttribute)

        PictureBox1.Image = background

Wichtig ist die ColorMatrix, mit der wird das Bild mit den Kreisen semi-transparent auf das andere Bild gezeichnet.

Gruß,
André