ďťż
 
hex2grayscale ďťż
 
hex2grayscale
Zobacz wiadomości
 
Cytat
A gdyby tak się wedrzeć na umysłów górę, / Gdyby stanąć na ludzkich myśli piramidzie, / I przebić czołem przesądów chmurę, / I być najwyższą myślą wcieloną. . . Juliusz Słowacki, Kordian
Indeks BCB i MySQL subiekt gt fototapeta
 
  Witamy

hex2grayscale



takeshin - 17-11-2006 07:15
hex2grayscale
  witam!

potrzebuję zamienić kolor
(docelowo funkcja w javascript) w postaci HEX np. na jego odpowiednik w
skali szarości
przykład: #22AE93=>#9a9a9a

jak powinien wyglądać algorytm zamiany?

rozumiem, że wszystkie trzy składowe trzeba wyrównać,
ale w jaki sposób?

z góry dziękuję za wszelkie informacje





Piotr Bochaczyk - 17-11-2006 07:15

  takeshin wrote:

> witam!
>
> potrzebuję zamienić kolor
> (docelowo funkcja w javascript) w postaci HEX np. na jego odpowiednik w
> skali szarości
> przykład: #22AE93=>#9a9a9a
>
> jak powinien wyglądać algorytm zamiany?
>
0.5*rr+gg+0.3*bb = gg

a cały kolor szary to po prostu gggggg
--
GCA/ED d s+:++ a C++ ULA P+++ L+ E--- W+++ N+++ o+ K- w+++ O+ M+ V-
PS PE++ Y-- PGP- t-- 5-- X+ !tv R b+ DI-- D+ G e++ h--- r+++ z+++*




takeshin - 17-11-2006 07:15

  >> witam!
>>
>> potrzebuję zamienić kolor
>> (docelowo funkcja w javascript) w postaci HEX np. na jego odpowiednik w
>> skali szarości
>> przykład: #22AE93=>#9a9a9a
>>
>> jak powinien wyglądać algorytm zamiany?
>>
> 0.5*rr+gg+0.3*bb = gg
>
> a cały kolor szary to po prostu gggggg

dla mojego przykładu:
rr=22 (34 dec)
gg=AE (174 dec)
bb=93 (147 dec)

23*0.5+174+147*0.3 = 235.1 (EB hex)

EB<>9A (154 dec)

skąd wziąłeś taki algorytm?




Piotr Bochaczyk - 17-11-2006 07:15

  takeshin wrote:

> EB<>9A (154 dec)
faktycznie mój błąd, tamten kawałek liczy coś innego ;)

prawidłowo powinno być:
lum:=r*0.299+g*0.587+b*0.114;

ale to i tak nie da Twojego wyniku
desaturacja to coś innego w wyniku niż zamiana na odcienie szarości ;)

desaturację robisz w następujący sposób...
zamieniasz RGB->HSV
S=0
zamieniasz HSV->RGB

a wzorki wyglądają tak (z pascalem sobie poradzisz mam nadzieję):

procedure TMyColor.RGBtoHSV;
var
delta,min:Extended;
begin
min:=MinValue([fR,fG,fB]);
fV:=MaxValue([fR,fG,fB]);
delta:=fV-min;
if Round(fV*10000000)=0.0 then fS:=0 else fS:=delta/fV;
if Round(fS*10000000)=0.0 then fH:=0 else begin
if Round(fR*10000000)=Round(fV*10000000) then fH:=60.0*(fG-fB)/delta
else if Round(fG*10000000)=Round(fV*10000000) then
fH:=120.0+60.0*(fB-fR)/delta
else if Round(fB*10000000)=Round(fV*10000000) then
fH:=240.0+60.0*(fR-fG)/delta;
if fH<0.0 then fH:=fH+360.0;
end;
end;

procedure TMyColor.HSVtoRGB;
var
i:Integer;
hTemp:Extended;
f,p,q,t:Extended;
begin
if fS=0.0 then begin
if fH=0 then begin
fR:=fV;
fG:=fV;
fB:=fV;
end;
end else begin
if fH=360.0 then hTemp:=0.0 else hTemp:=fH;
hTemp:=hTemp/60;
i:=trunc(hTemp);
f:=hTemp-i;
p:=fV*(1.0-fS);
q:=fV*(1.0-(fS*f));
t:=fV*(1.0-(fS*(1.0-f)));
case i of
0:begin fR:=fV;fG:=t;fB:=p; end;
1:begin fR:=q;fG:=fV;fB:=p; end;
2:begin fR:=p;fG:=fV;fB:=t; end;
3:begin fR:=p;fG:=q;fB:=fV; end;
4:begin fR:=t;fG:=p;fB:=fV; end;
5:begin fR:=fV;fG:=p;fB:=q; end;
end;
end;
end;

jedna uwaga...
wartości RGB podane są jako liczby rzeczywiste z zakresu 0..1
H to kąt z zakresu 0..360 - oczywiście rzeczywisty
S i V maja zakres 0..100 - jak wyżej
daje to wyższą dokładność obliczeń i wykorzystuje kooprocesor ;)

--
GCA/ED d s+:++ a C++ ULA P+++ L+ E--- W+++ N+++ o+ K- w+++ O+ M+ V-
PS PE++ Y-- PGP- t-- 5-- X+ !tv R b+ DI-- D+ G e++ h--- r+++ z+++*





takeshin - 17-11-2006 07:15

  > faktycznie mój błąd, tamten kawałek liczy coś innego ;)
>
> prawidłowo powinno być:
> lum:=r*0.299+g*0.587+b*0.114;

dzięki ;)
coś takiego mi wystarczy

>
> desaturację robisz w następujący sposób...
> zamieniasz RGB->HSV
> S=0
> zamieniasz HSV->RGB

sprawdziłem ten sposób,
ale nie bardzo mi to działało...
wybierało największą wartość z trzech składowych
i pozostałe ustawiało na taką samą
hmm... może coś spaściłem ;)
  • zanotowane.pl
  • doc.pisz.pl
  • pdf.pisz.pl
  • effulla.pev.pl
  • comp
    backup poczty w oraclu [corel] jak hurtem element RBG -> CMYK [mySQL] autoinkrementacja Re: Przerysowanie mapy - jak najlepiej? Licencja Oracle i niedoinformowana infolinia "SELECT" w xharbour =?iso-8859-2?q?Wywo=B3anie_procedury_sk=B3adowanej?= Problemy z karta graficzna?? Pole integer - działanie nacałej bazie dynamiczny sql
  • zanotowane.pl
  • doc.pisz.pl
  • pdf.pisz.pl
  • degrassi.opx.pl
  • Cytat

    Decede mihi sole - nie zasłaniaj mi słonca.
    Gdy kogoś kochasz, jesteś jak stworzyciel świata - na cokolwiek spojrzysz, nabiera to kształtu, wypełnia się barwą, światłem. Powietrze przytula się do ciebie, choćby był mróz, a ty masz w sobie tyle radości, że musisz ją rozdawać wokoło, bo się w tobie nie mieści
    Hoc fac - tak czyń.
    A tergo - od tyłu; z tyłu.
    I czarne włosy posiwieją. Safona

    Valid HTML 4.01 Transitional

    Free website template provided by freeweblooks.com