Hi,
ich suche eine Funktion, die zwei Farben nach dem Schema der SUBTRAKTIVEN Farbmischung mischen kann.
Leider sind alle Funktionen vom Framework ausschließlich für die additive Farbmischung ausgelegt. Zum Beispiel die Funktion „LinearGradientBrush“.
Genau so einen Farbverlauf muss ich aber mit einer subtraktiven Farbmischung realisieren.
(Es geht um echte Druckfarben, die anteilig gemischt werden müssen. Zum Auswählen möchte ich einen Farbverlauf produzieren)
Ich hoffe, hier kennt sich jemand mit den Farbsystemen aus? Leider ist 90% des Internets voller falscher Informationen zu diesem Thema.
Zur Erklärung:
RGB Farben sind die Grundfarben der additiven Farbmischung (Selbstleuchtende Farben).
CMY für subtraktive Mischung (z.B. Druckfarben).
In der Theorie ist Schwarz nicht nötig, da je 100% C, M und Y Schwarz ergeben. In der Praxis wird für besonders dunkle Farben Schwarz zugemischt.
100% Cyan und 100% Yellow sollten gemischt und in RGB umgerechnet dann 100% Grün geben.
Genau da beginnt mein Problem:
Ich bekomme ein „Hellgrün“ statt „Sattgrün“
Was ich bisher habe:
Function MischMich(Farbe1 As Color, Farbe2 As Color, Optional AnteilFarbe1 _
As Double = 0.5) As Color
Dim AnteilFarbe2 As Double = 1 - AnteilFarbe1
'▼▼▼ Trennen in RGB-Variablen für einfachere
' Handhabung beim Experimentieren,
' etwas übertrieben nach Double, wird alles später optimiert ;-)
Dim R1 As Double = Farbe1.R
Dim G1 As Double = Farbe1.G
Dim B1 As Double = Farbe1.B
Dim R2 As Double = Farbe2.R
Dim G2 As Double = Farbe2.G
Dim B2 As Double = Farbe2.B
'▼▼▼ Umrechnen von RGB --> CMY:
' Vielleicht schon da ein Fehler?
' Ist das überhaupt nötig?
' Vielleicht geht die Addition auch direkt aus RGB?
Dim C1 As Double = 255 - R1
Dim M1 As Double = 255 - G1
Dim Y1 As Double = 255 - B1
Dim C2 As Double = 255 - R2
Dim M2 As Double = 255 - G2
Dim Y2 As Double = 255 - B2
'▼▼▼ Addition:
' Klappt bei dunklen Farben einigermaßen. Helle werden aber ZU hell.
Dim C3 As Double = C1 * AnteilFarbe1 + C2 * AnteilFarbe2
Dim M3 As Double = M1 * AnteilFarbe1 + M2 * AnteilFarbe2
Dim Y3 As Double = Y1 * AnteilFarbe1 + Y2 * AnteilFarbe2
'▼▼▼ Zurück nach RGB:
Dim R3 As Double = 255 - C3
Dim G3 As Double = 255 - M3
Dim B3 As Double = 255 - Y3
'▼▼▼ Und zurück als Farbe:
Return Color.FromArgb(R3, G3, B3)
End Function Zum bequemen Nachstellen ein Form mit 3 Panels, 1 Label und einem TrackBar bauen und diesen Code einfügen:
Private Sub Form1_Load(sender As System.Object, e As System.EventArgs) _
Handles MyBase.Load
' Mache ich sonst im Designer, für's Forum mal so:
TrackBar1.Maximum = 100
TrackBar1.TickFrequency = 10
TrackBar1.RightToLeft = Windows.Forms.RightToLeft.Yes
TrackBar1.Value = 50
Panel1.BackColor = Color.FromArgb(0, 255, 255)
Panel2.BackColor = Color.FromArgb(255, 255, 0)
Label1.Text = TrackBar1.Value & "% : " & 100 - TrackBar1.Value & "%"
End Sub
Private Sub Panels_Click(sender As Object, e As System.EventArgs) Handles _
Panel1.Click, Panel2.Click
ColorDialog1.Color = DirectCast(sender, Panel).BackColor
If ColorDialog1.ShowDialog = Windows.Forms.DialogResult.OK Then
DirectCast(sender, Panel).BackColor = ColorDialog1.Color
End If
End Sub
Private Sub Panels_BackColorChanged(sender As Object, e As _
System.EventArgs) Handles Panel1.BackColorChanged, Panel2.BackColorChanged
Panel3.BackColor = MischMich(Panel1.BackColor, Panel2.BackColor, _
TrackBar1.Value / 100)
End Sub
Private Sub TrackBar1_Scroll(sender As System.Object, e As _
System.EventArgs) Handles TrackBar1.Scroll
Panel3.BackColor = MischMich(Panel1.BackColor, Panel2.BackColor, _
TrackBar1.Value / 100)
Label1.Text = TrackBar1.Value & "% : " & 100 - TrackBar1.Value & "%"
End Sub In "Mittelstellung" der Trackbar ist das grün einfach zu hell.
Hat da jemand eine Idee?
Bye,
Dilbert
--
while (!asleep()) sheep++; |