Delphi-PRAXiS

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)

Alexander Roth 2. Jan 2007 13:24


Farben kombinieren
 
Hallo,

ich würde gerne Farben kombinieren und das am besten mit BitBlt.
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
Gelb+Blau=Grün
.
.
.

Ich weis nicht welche dieser Optionen von BitBlt passt. Und ich glaube es tut leider keine.

Wisst ihr Rat?

Gruß Alexander

Der_Unwissende 2. Jan 2007 13:46

Re: Farben kombinieren
 
Hi,
bei mind. 24 Bit Farbtiefe sollte dir SrcPaint weiterhelfen. Die Operation die du hier benötigst ist das logische Oder. Hier wird jedes Bit immer dann 1, wenn mind. eines der beiden Bits 1 ist, für weiß ist dies eine Tautologie für jedes Bit. Bei Schwarz sieht es analog aus, hier wird die andere Farbe komplett unverändert übernommen.
Hast du >=24 Bit Farbtiefe, so werden die Farbwerte immer RGB (je ein Byte) kodiert abgelegt und mittels oder wird hier wirklich die Farbe gemischt. Anders sähe dass bei den kleineren (indizierten) Farbwerten aus. Hier würdest du nur den Wert des Index mittels oder verändern, was aber an dieser Stelle in der Farbtabelle steht hat nichts mit den Ausgangsfarben zu tun.

Gruß Der Unwissende

Alexander Roth 2. Jan 2007 14:28

Re: Farben kombinieren
 
Liste der Anhänge anzeigen (Anzahl: 3)
Also, so richtig gut klappen tut es nicht aus grau+grün wird hellgrün.
Ich habe hier die Bilder. Man muss die ein bisschen vergößern (800 mal). Dann sieht man dass es so richtig nicht klappt.

Gruß Alexander

Khabarakh 2. Jan 2007 15:17

Re: Farben kombinieren
 
Zitat:

Zitat von Alexander Roth
Gelb+Blau=Grün

Wie soll das funktionieren :gruebel: ?
Code:
FFFF00
0000FF
------
00FF00
Du siehst, mit RGB+Bit-Verknüpfungen kann man hier nicht weit kommen, du musst eine eigene Formel aufstellen. Vielleicht helfen dir noch andere Farbsysteme wie HLS, aber aus diesen drei Beispielen kann ich wirklich nicht herauslesen, welche Farbkombination du erreichen willst.

Alexander Roth 2. Jan 2007 15:52

Re: Farben kombinieren
 
Zitat:

Zitat von Khabarakh
Zitat:

Zitat von Alexander Roth
Gelb+Blau=Grün


Da habe ich mich wohl ein bisschen vertan.
War es Gelb+Grün=Blau?

Zitat:

Zitat von Khabarakh
Du siehst, mit RGB+Bit-Verknüpfungen kann man hier nicht weit kommen, du musst eine eigene Formel aufstellen.

Mist.

Zitat:

Zitat von Khabarakh
aber aus diesen drei Beispielen kann ich wirklich nicht herauslesen, welche Farbkombination du erreichen willst.

Diese

jakobwenzel 2. Jan 2007 15:57

Re: Farben kombinieren
 
Mit GetRValue, GetGValue und GetBValue die einzelnen Farbwerte extrahieren, addieren und mit rgb wieder zusammensetzen.

Alexander Roth 2. Jan 2007 16:11

Re: Farben kombinieren
 
So einfach?

Der_Unwissende 2. Jan 2007 16:14

Re: Farben kombinieren
 
Zitat:

Zitat von Alexander Roth
So einfach?

Na ja, Farbwerte Extrahieren, addieren und wieder zusammensetzen ist nichts anderes als das Logische oder ohne Übertrag (also so ziemlich dass, was du hier schon hast).

Alexander Roth 2. Jan 2007 16:19

Re: Farben kombinieren
 
Sicher, dass das nichts anderes ist als das logische?

Der_Unwissende 2. Jan 2007 16:32

Re: Farben kombinieren
 
Zitat:

Zitat von Alexander Roth
Sicher, dass das nichts anderes ist als das logische?

Nein, es dürfte was anderes sein, aber nicht das erwartete. Nimmer einfach mal weiß, dass wäre $FFFFFF (24 Bit) extrahier hier den rot Anteil -> $FF. Jetzt addier einfach mal 1 zu diesem Rot Wert (weil du es mit der Farbe $010000 mischen möchtest), dann würde beim addieren ein Übertrag rauskommen, da $FF schon das größte Byte ist, dass man speichern kann. Da du aber nur das niederwertigste Byte deiner Summe betrachtest hättest du an dieser Stelle kein weiß mehr!

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.

Alexander Roth 3. Jan 2007 10:59

Re: Farben kombinieren
 
:roteyes:
Also ich bin jetzt a bissel verwirrt.
Also um alle Missverständnisse aufzuklären:
Ich will eine Mischung wie bei echten Lichtfarben (und kein Malkasten). Das heißt also Additive Farbsynthese, und keine Farbmischung!!!


Zitat:

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

Das ist das Problem. Wie kriegt man das gelöst?

Könnte man vielleicht normal addieren, (ohne abschneiden auf 255) und dann alles auf 255 runterskalieren?
Wäre das eine Lösung?

Gruß Alexander

Reinhard Kern 3. Jan 2007 12:40

Re: Farben kombinieren
 
Zitat:

Zitat von Alexander Roth
:roteyes:
Also ich bin jetzt a bissel verwirrt.
Also um alle Missverständnisse aufzuklären:
Ich will eine Mischung wie bei echten Lichtfarben (und kein Malkasten). Das heißt also Additive Farbsynthese, und keine Farbmischung!!!


Zitat:

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

Das ist das Problem. Wie kriegt man das gelöst?

Könnte man vielleicht normal addieren, (ohne abschneiden auf 255) und dann alles auf 255 runterskalieren?
Wäre das eine Lösung?

Gruß Alexander

Hallo,

dann ist addieren und dividieren durch 2 (allgemein für n>2 Durchschnitt) schon das Richtige: so addieren sich zwei nebeneinanderliegende Pixel eines Farbbildschirms auf grössere Entfernung. Additiv ist das deswegen, weil RGB ja das Farbmodell für additive Systeme wie einen selbstleuchtenden Bildschirm ist. Für den Malkasten gilt das komplementäre System der Druckfarben (Cyan-Magenta-Gelb) und eine andere Rechnung, weil sich da alles zu schwarz addiert.

Nebenbei bemerkt: BitBlt sind per Definitionem bitweise logische Operationen, Farben addieren oder Mischen geht damit grundsätzlich nicht, weil Addieren weder eine bitweise noch eine logische Operation ist.

Gruss Reinhard
Es genügt nicht, einen Algorithmus nicht zu verstehen, man muss auch unfähig sein, ihn in Programmcode umzusetzen.

Alexander Roth 3. Jan 2007 15:33

Re: Farben kombinieren
 
Sicher dass der Mittelwert das richtige ist?

Ich habe die Farben nochmal überdacht und es müsste so heißen:
weis+grün = sehr helles grün
schwarz+grün=grün
schwarz+weis=weis


Tschüss

Alexander

kalmi01 3. Jan 2007 16:42

Re: Farben kombinieren
 
Zitat:

Zitat von Alexander Roth
Ich habe die Farben nochmal überdacht und es müsste so heißen:
weis+grün = sehr helles grün
schwarz+grün=grün
schwarz+weis=weis

Sieht für mich so aus, als wenn Du nicht die Farben, sondern die Luminanzen addieren willst.

Was ergibt 50% Schwarz (=Grau) + 100% Rot
nach Deiner Meinung ?
Ein dunkleres Rot oder ein blasseres Rot ?

Du hast immer was mit SCHWARZ oder WEISS gemischt, was ist bei Farbe + Farbe ?

Alexander Roth 3. Jan 2007 17:03

Re: Farben kombinieren
 
Es bleibt wie ich gesagt habe. Es muss die Additive Farbsynthese sein!

Zitat:

Zitat von kalmi01
Was ergibt 50% Schwarz (=Grau) + 100% Rot
nach Deiner Meinung ?
Ein dunkleres Rot oder ein blasseres Rot ?

Blasseres Rot. nach der Additive Farbsynthese müsste das so sein.

Doch die Frage ist: Wie kriege ich die Additive Farbsynthese bei RGB Farben hin?


Gruß Alexander

Reinhard Kern 3. Jan 2007 17:58

Re: Farben kombinieren
 
Zitat:

Zitat von Alexander Roth
Sicher dass der Mittelwert das richtige ist?

Ich habe die Farben nochmal überdacht und es müsste so heißen:
weis+grün = sehr helles grün
schwarz+grün=grün
schwarz+weis=weis


Tschüss

Alexander

Hallo, falsch gedacht.

Wenn du auf einem Bildschirm abwechselnd schwarze und weisse Punkte setzt, bekommst du nicht weiss, sondern mittelgrau, das macht man ja auch absichtlich so (dithering). Wenn ein RGB-Bildschirm nicht das Additive Farbmodell ist, weiss ich beim besten Willen nicht, was du dir darunter vorstellen willst.

Aber selbstverständlich kannst du dir völlig eigene Addiertheoreme definieren, du musst dann bloss eine passende Software dafür schreiben. Dann ist alles erlaubt.

Gruss Reinhard

Namenloser 3. Jan 2007 18:59

Re: Farben kombinieren
 
Es geht hier aber nicht ums Dithering, sondern um die ADDITIVE FARBSYNTHESE!

und die beruht, wie der name schon sagt, darauf, dass zwei farben addiert werden.
und das ginge ja einfach so:
Delphi-Quellcode:
function AddColors(color1,color2: tcolor): TColor;
var r1, g1, b1,
    r2, g2, b2: byte
    r3, g3, b3: integer;
begin
  // falls es sich um eine Windows-Standartfarbe wie z.b clBtnface handelt:
  color1 := colortorgb(color1);
  color2 := colortorgb(color2);
 
  // zerlegen von Farbe 1
  r1 := getrvalue(color1); // ROT
  g1 := getgvalue(color1); // GRÜN
  b1 := getbvalue(color1); // BLAU
  // zerlegen von Farbe 2
  r2 := getrvalue(color2); // ROT
  g2 := getgvalue(color2); // GRÜN
  b2 := getbvalue(color1); // BLAU
  // addieren
  r3 := r1+r2;
  if r3 > 255 then r := 255;
  g3 := g1+g2;
  if g3 > 255 then g := 255;
  b3 := b1+b2;
  if b3 > 255 then b := 255;
 
  // farbwerte zusammensetzen
  result := rgb(r3,g3,b3);
end;
(Zugegebenermaßen nicht gerade optimiert)

Aber das geht mit der additiven Farbmischung nciht:
weis+grün = sehr helles grün <-- wäre weiß
schwarz+grün=grün <-- stimmt
schwarz+weis=weis <-- stimmt

Alexander Roth 4. Jan 2007 08:23

Re: Farben kombinieren
 
Zitat:

Zitat von NamenLozer
Es geht hier aber nicht ums Dithering, sondern um die ADDITIVE FARBSYNTHESE!

und die beruht, wie der name schon sagt, darauf, dass zwei farben addiert werden.
und das ginge ja einfach so:
Delphi-Quellcode:
function AddColors(color1,color2: tcolor): TColor;
var r1, g1, b1,
    r2, g2, b2: byte
    r3, g3, b3: integer;
begin
  // falls es sich um eine Windows-Standartfarbe wie z.b clBtnface handelt:
  color1 := colortorgb(color1);
  color2 := colortorgb(color2);
 
  // zerlegen von Farbe 1
  r1 := getrvalue(color1); // ROT
  g1 := getgvalue(color1); // GRÜN
  b1 := getbvalue(color1); // BLAU
  // zerlegen von Farbe 2
  r2 := getrvalue(color2); // ROT
  g2 := getgvalue(color2); // GRÜN
  b2 := getbvalue(color1); // BLAU
  // addieren
  r3 := r1+r2;
  if r3 > 255 then r := 255;
  g3 := g1+g2;
  if g3 > 255 then g := 255;
  b3 := b1+b2;
  if b3 > 255 then b := 255;
 
  // farbwerte zusammensetzen
  result := rgb(r3,g3,b3);
end;
(Zugegebenermaßen nicht gerade optimiert)

Super!!! Danke. Ich probiere es aus sobald meine Arbeit (trotz Ferien :cry: ) es zulässt.


Zitat:

Zitat von NamenLozer
weis+grün = sehr helles grün <-- wäre weiß
schwarz+grün=grün &lt;-- stimmt
schwarz+weis=weis &lt;-- stimmt

Dann hatte ich ja doch von Anfang an recht.


@Reinhard Kern:
ich glaube dein denkfehler ist, dass schwarz eine Frabe ist. Das ist sie nämlich NICHT!!! Jedenfalls bei den normalen Lichtfarben. Sieht man auch auf den Bild Da ist alles mit einer schwarzen "Farbe" hinterlegt und sie hat keinen Einfluss auf das schöne ungetrübte Weis in der Mitte.



EDIT:
:dance: :dance: :dance: :dance:
:-D Es funktioniert!!! Super!!! Problem gelöst!!!

Danke an alle für eure Hilfe!

Gruß Alexander


Alle Zeitangaben in WEZ +1. Es ist jetzt 22:17 Uhr.

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