![]() |
Re: Farben kombinieren
Additive Farbmischung geht doch ganz einfach o.ô
Delphi-Quellcode:
bitblt(canvas1.Handle,0,0,width,height,canvas2.Handle,0,0,srcand);
|
Re: Farben kombinieren
Klappt nicht. Das Kombinierte Bild ist pur schwarz.
|
Re: Farben kombinieren
Zitat:
ihr habt bisher übersehen, dass man in allen Fällen die resultierende Farbe renormieren müsste, sonst würde sie ja immer doppelt so hell bei gleicher Ausgangsfarbe, was nicht erwünscht ist. Ausserdem erledigt das das Überlaufproblem: ist bei beiden Ausgangsfarben Rot = F0, so ergibt (F0 + F0) / 2 , eben F0. So sollte es doch auch sein. Um es physiologisch korrekt zu machen, müsste man die beiden Farben ins Farbdreieck eintragen, die Verbindungslinie zeichenen und halbieren. Um dem nahezukommen, kann man auch in HSL konvertieren, dann wäre S = (S1 + S2) / 2 und L = (L1 + L2) / 2, für H müsste man die Winkelhalbiernde nehmen - ich weiss bloss nicht, wie man die Zweideutigheit bei 180 Grad behandeln muss, das müsste man sich wohl an einem Farbkreis veranschaulichen. Ganz sicher gibt es kein BitBlt, das Farben richtig mischt. Gruss Reinhard |
Re: Farben kombinieren
Zitat:
|
Re: Farben kombinieren
So mach ich das immer, funkt bestens...
Delphi-Quellcode:
Grüßle!
function SCombineColor(const Color1, Color2:DWord):DWord;
var RGB1, RGB2, xRGB:TRGB; begin ... xRGB.Red:= Round((RGB1.Red+ RGB2.Red) / 2); xRGB.Green:=Round((RGB1.Green+RGB2.Green) / 2); xRGB.Blue:= Round((RGB1.Blue+ RGB2.Blue) / 2); ... end; |
Re: Farben kombinieren
Zitat:
Zitat:
|
Re: Farben kombinieren
Hmm, irgendwie hat mich der Thread verwirrt... :roteyes:
Sorry :( |
Re: Farben kombinieren
Die oben geforderten Bedingungen werden 1a durch bloßes addieren von r, g und b erfüllt. Folglich ist das bereits genannte Aufsplitten in die Farbkanäle, addieren dieser, beschneiden auf eine Range von 0-255, und rekombinieren mit rgb() genau das Vorgehen der Wahl.
Das Verhalten ist das von Lichtfarben, und diese verhalten sich absolut additiv. Nichts was ein bischen wie additiv wäre. Das Verfahren, dass Reinhard beschreibt, würde die physiologisch am ehesten richtige Methode sein, um beim Alphablending zwei Farbwerte zu mischen. Die reine Mittelwertbildung ((R1+R2)/2)erfüllt den gleichen Zweck, ohne die Betrachtung von physiologischen Umständen. Also ein mathematisch korekter Alphablend zu je gleichen Anteilen (50% Deckung). Alles nicht das richtige, um o.g. Vorgaben zu erreichen. Additive Farben schon :) |
Re: Farben kombinieren
Zitat:
das war/ist das Problem von Anfang an: schon die Fragestellung enthält einen Denkfehler - wenn man addiert und den Übertrag abschneidet (wie gefordert, "weisser als weiss geht nicht"), dann erhält man automatisch Veränderungen des Farbtons: Rot FF + Rot FF gibt eben Rot FF, Grün 40 + Grün 40 gibt Grün 80, d.h. der relative Anteil von Grün hat sich verdoppelt. Anders gesagt, Addieren und Mischen sind ein Widerspruch in sich, beides geht nicht, es sei denn, man beschränkt sich auf Sternenhimmel ohne Mond. Gruss Reinhard Editiert: Nachtrag zur Frage direkt: der Fragesteller hat gefordert Schwarz + Weiss -> Weiss, mein Ergebnis ist Schwarz + Weiss -> mittleres Grau. Die Realität spricht für die 2. Lösung, nimm einen Malkasten. |
Re: Farben kombinieren
Zitat:
Delphi-Quellcode:
kannst du dir aber das Runden sparen. Ausser natürlich es soll auch aufgerundet werden, was aber sicher keinen visuell sichtbaren Unterschied macht.
xRGB.Red := (RGB1.Red + RGB2.Red) div 2;
Ich denke Alexander hat doch unmissverständlich gesagt, dass er eine ![]() |
Alle Zeitangaben in WEZ +1. Es ist jetzt 15:43 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz