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:
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
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:
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
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 304784
Url: https://administrator.de/contentid/304784
Ausgedruckt am: 25.11.2024 um 00:11 Uhr
3 Kommentare
Neuester Kommentar
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:
Dadurch solltest du ein Bild erhalten, dass all deine spezifischen Anforderungen erfüllt.
Gruß,
@Snowman25
Anscheinend kennst du dich mit .NET und Bildmanipulation recht gut aus (Zumindest mehr als ich).
Hier ein Denkanstoß, der dir helfen könnte:
- Du erstellst ein neues Bild in der gleichen Dimension wie dein Original, aber mit transparentem Hintergrund.
- Auf das neue Bild machst du deine Kreise. Und zwar:
- Zuerst die Roten, 100% deckend
- Dann machst du das Bild so transparent, wie du es brauchst.
- 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.
- 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
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:
Wichtig ist die ColorMatrix, mit der wird das Bild mit den Kreisen semi-transparent auf das andere Bild gezeichnet.
Gruß,
André
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é