Kolor barwy dopełniającej - complementary color

0

hej

słuchajcie jak uzyskać barwę dopełniającą ? tak jak na kole kolorów np http://colorschemedesigner.com/
kliknijcie complementary color. jeśli wybieram czerwone tło dla tshape to chciałbym aby tekst labela na nim był zielony

RGBtoTColor - wygooglałem
ColorRGBToHLS i ColorHLSToRGB - moduł graphutil
colorToRGB - moduł graphics

mam tyle - pytanie ile trzeba dodać lub odjąć do hue żebym uzyskał przeciwną wartość ? albo może coś w kodzie robię źle ?

 
uses graphutil, graphics

Function RGBtoTColor(const r,g,b:byte):Tcolor;
 
  begin
   Result:=B Shl 16 Or
          G Shl 8  Or
          R;
   //Result := ((R and $FF) shl 16) +
   //((G and $FF) shl 8) + (B and $FF);
  end;

Function TfrmGlowna.ComplementaryColor(ksztalt:tshape):Tcolor;
  var
    rgb : Longint;
    h,l,s : word;
    gotowy : tcolor;
Begin
  RGB:=colorToRGB(ksztalt.Brush.Color);
  ColorRGBToHLS(rgb,h,l,s);
  h:=h+180;
  //if h>360 then dec(h,360);

  rgb:=ColorHLSToRGB(h,l,s);
  gotowy:=rgbtotcolor(GetRValue(rgb),GetGValue(rgb),GetBValue(rgb));
  result:=gotowy;
End;
0

yy a nie wystarczy na pałę:

function inversecolor(color:TColor):TColor;
begin
  result:=rgbtotcolor(255-GetRValue(color),255-GetGValue(color),255-GetBValue(color));
end;

co można by dalej uprościć przez negację odpowiednich bajtów?

jeśli wybieram czerwone tło dla tshape to chciałbym aby tekst labela na nim był zielony
pora poznać prawdę i oduczyć się mitów wciskanych na plastyce, że przeciwieństwem czerwonego jest zielony.

0

nie bo wyjdzie ci barwa w negatywie, a nie dopełniająca. poza tym zerknij na to koło z linka. tam jest to ładnie pokazane.

0

koło z linka pokazuje właśnie bzdurny model kolorów, który nie ma fizycznego sensu. prawdopodobnie to co otrzymujesz przez zmianę H o 180° to to co powinieneś dostawać.

0

pytanie czy na pewno dostaje dobre wartosci, i dlaczego w specyfikacjach tych funkcji są wartości word a nie byte.
moze jescze ktoś na to zerknąc ? jesli jest to kwestia finansowa to powiedzcie.

2

po prostu to sprawdź w jakich przedziałach Ci zwraca wartości HLS
prawdopodobnie 0-240 i musisz dodać połowę tego czyli 120
poza tym powinieneś chyba sprowadzic to z powrotem do przedziału 0-240 czyli podzielić modulo 241:

hue := (hue + 120) mod 241;

0

DZIEKUJE!!!! działa!
co prawda ma problem z szarościami
macie na to jakiś pomysł ? pewnie to jest jeden warunek

0

jak bym wiedział jak to bym napisał i wiam tu podał aby wątek był kompletny. proszę no pomyślcie jeszcze chwilkę nad tym

0

to opisz słownie chociaż jak wg cb powinien wyglądać kolor dopełniający z szarości
teoretycznie barwa dopełniająca to barwa która połączona z bazową da kolor biały (w metodzie addytywnej stosowanej w monitorach) - problem w tym że to się nie sprawdza w modelu RGB (w ogóle się gdzieś sprawdza? R+G != W, dopiero R+G+B=W lub Red+Cyan)

możesz jednak przyjąć za wyjątek szarości i dla nich po prostu zastosować negatyw
szarość wykrywasz po tym że s = 0

0

hue := (hue + 120) mod 241;

jesteś pewien że mod 241? prawdopodobnie (ale zgaduję) wartość 240 to „pełen obrót”, czyli tyle samo co 0. wtedy wychodziłoby mod 240. trzeba to sprawdzić.

problem w tym że to się nie sprawdza w modelu RGB
gdyby RGB się „nie sprawdzało” to by nie było używane. co się nie sprawdza to właśnie ten „plastyczny” model w którym barwami podstawowymi są czerwony, żółty i niebieski.

(w ogóle się gdzieś sprawdza? R+G != W, dopiero R+G+B=W lub Red+Cyan)

bo właśnie R+C = W, a nie R+G. wniosek: zielony NIE JEST barwą dopełniającą czerwieni. Modele RGB i CMY/CMYK są w porządku i wzajemnie się uzupełniają.
Model RYB jest pomieszaniem obu i po prostu nie działa. Powstał kilkaset lat temu kiedy nie wiedziano jeszcze czym jest światło i jak jest odbierane przez oko ludzkie.

możesz jednak przyjąć za wyjątek szarości i dla nich po prostu zastosować negatyw

Z tym będzie problem, bo zarówno negatyw jak i dopełnienie szarości 50% da szarość 50%. Może by wykrywać ten fakt (niska saturacja + jasność bliska połowy = szarość) i dawać biały albo czarny.

0

jesteś pewien że mod 241? prawdopodobnie (ale zgaduję) wartość 240 to „pełen obrót”, czyli tyle samo co 0. wtedy wychodziłoby mod 240. trzeba to sprawdzić.

240 mod 241 = 240
241 mod 241 = 0
Czyli zakres 0-240 = wszystko jest okej.

0
payl napisał(a)

jesteś pewien że mod 241? prawdopodobnie (ale zgaduję) wartość 240 to „pełen obrót”, czyli tyle samo co 0. wtedy wychodziłoby mod 240. trzeba to sprawdzić.

240 mod 241 = 240
241 mod 241 = 0
Czyli zakres 0-240 = wszystko jest okej.

Azarien mówi o tym że w tym przypadku może być tak że 0 = 240 (tak jak 0°=360°), czyli dając mod 241 mamy podwójne zero
całkiem możliwe - można to sprawdzić, bo dopełnienie z kolorów o hue >= 120 byłyby wtedy przekłamane o 1/240 (niezauważalnie)

1 użytkowników online, w tym zalogowanych: 0, gości: 1