![]() |
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 |
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 |
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 |
Re: Farben kombinieren
Zitat:
Code:
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.
FFFF00
0000FF ------ 00FF00 |
Re: Farben kombinieren
Zitat:
War es Gelb+Grün=Blau? Zitat:
Zitat:
![]() |
Re: Farben kombinieren
Mit GetRValue, GetGValue und GetBValue die einzelnen Farbwerte extrahieren, addieren und mit rgb wieder zusammensetzen.
|
Re: Farben kombinieren
So einfach?
|
Re: Farben kombinieren
Zitat:
|
Re: Farben kombinieren
Sicher, dass das nichts anderes ist als das logische?
|
Re: Farben kombinieren
Zitat:
|
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 ![]() |
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 ![]() Zitat:
Könnte man vielleicht normal addieren, (ohne abschneiden auf 255) und dann alles auf 255 runterskalieren? Wäre das eine Lösung? Gruß Alexander |
Re: Farben kombinieren
Zitat:
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. |
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 |
Re: Farben kombinieren
Zitat:
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 ? |
Re: Farben kombinieren
Es bleibt wie ich gesagt habe. Es muss die
![]() Zitat:
![]() Doch die Frage ist: Wie kriege ich die ![]() Gruß Alexander |
Re: Farben kombinieren
Zitat:
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 |
Re: Farben kombinieren
Es geht hier aber nicht ums Dithering, sondern um die
![]() und die beruht, wie der name schon sagt, darauf, dass zwei farben addiert werden. und das ginge ja einfach so:
Delphi-Quellcode:
(Zugegebenermaßen nicht gerade optimiert)
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; 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 |
Re: Farben kombinieren
Zitat:
Zitat:
@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 ![]() 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 19:05 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 by Thomas Breitkreuz