Delphi-PRAXiS
Seite 2 von 3     12 3      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Farben kombinieren (https://www.delphipraxis.net/83413-farben-kombinieren.html)

Namenloser 2. Jan 2007 16:37

Re: Farben kombinieren
 
Additive Farbmischung geht doch ganz einfach o.ô

Delphi-Quellcode:
bitblt(canvas1.Handle,0,0,width,height,canvas2.Handle,0,0,srcand);

Alexander Roth 2. Jan 2007 17:09

Re: Farben kombinieren
 
Klappt nicht. Das Kombinierte Bild ist pur schwarz.

Reinhard Kern 2. Jan 2007 17:36

Re: Farben kombinieren
 
Zitat:

Zitat von Alexander Roth
Klappt nicht. Das Kombinierte Bild ist pur schwarz.

Hallo,

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

Der_Unwissende 2. Jan 2007 17:49

Re: Farben kombinieren
 
Zitat:

Zitat von Reinhard Kern
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.

Gut, dann hast du schwarz und weiß, also $FFFFFF / 2, nicht ganz das was in Beitrag 1 gefordert war, oder übersehe ich nur etwas? Ich denke mal auf genau diese Frage, was jetzt genau in welchem Verhältnis gemischt werden soll, zielte die Frage von Khabarakh ab.

Sunlight7 2. Jan 2007 19:13

Re: Farben kombinieren
 
So mach ich das immer, funkt bestens...

Delphi-Quellcode:
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;
Grüßle!

Der_Unwissende 2. Jan 2007 19:35

Re: Farben kombinieren
 
Zitat:

Zitat von Sunlight7
So mach ich das immer, funkt bestens...

Delphi-Quellcode:
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;

Ja, aber das erfüllt doch nie im Leben


Zitat:

Zitat von Alexander Roth
Das soll solche bedingungen erfüllen:
weis+grün = weis (heller geht es ja schließlich nicht)
schwarz+grün=grün
schwarz+weis=weis

Wenn du hier weiß mit etwas wie grün oder schwarz kombinierst, wird etwas rauskommen, dass dunkler ist als weiß. Und bei schwarz und etwas anderem, nennen wir die Farbe X, wird nicht X sondern etwas dunkleres (X / 2) rauskommen. Ist also letztlich das gleiche Problem (die Gleiche Lösung) wie beim Vorschlag von Reinhard Kern (ausser ich überseh einfach etwas, dann hab ich nichts gesagt).

Sunlight7 2. Jan 2007 19:45

Re: Farben kombinieren
 
Hmm, irgendwie hat mich der Thread verwirrt... :roteyes:
Sorry :(

dizzy 3. Jan 2007 00:15

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 :)

Reinhard Kern 3. Jan 2007 01:07

Re: Farben kombinieren
 
Zitat:

Zitat von Der_Unwissende

Gut, dann hast du schwarz und weiß, also $FFFFFF / 2, nicht ganz das was in Beitrag 1 gefordert war, oder übersehe ich nur etwas? Ich denke mal auf genau diese Frage, was jetzt genau in welchem Verhältnis gemischt werden soll, zielte die Frage von Khabarakh ab.

Hallo,

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.

Alien426 3. Jan 2007 09:16

Re: Farben kombinieren
 
Zitat:

Zitat von Sunlight7
So mach ich das immer, funkt bestens...
Delphi-Quellcode:
xRGB.Red:= Round((RGB1.Red+  RGB2.Red)  / 2);

Mit
Delphi-Quellcode:
xRGB.Red := (RGB1.Red + RGB2.Red) div 2;
kannst du dir aber das Runden sparen. Ausser natürlich es soll auch aufgerundet werden, was aber sicher keinen visuell sichtbaren Unterschied macht.

Ich denke Alexander hat doch unmissverständlich gesagt, dass er eine Additive Farbsynthese möchte. In dem Fall würde das vorher geschriebene nicht mehr gelten, weil es ja auch in mehereren Fällen nicht möglich ist.


Alle Zeitangaben in WEZ +1. Es ist jetzt 16:44 Uhr.
Seite 2 von 3     12 3      

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz