Temat: 0..255 == 0x [rr gg bb] RGB ?
Witam, jest jakiś odpowiednik (wzór przekształcenia) barwy RGB na kolor atarynki ?
Press play on tape...
Nie jesteś zalogowany. Proszę się zalogować lub zarejestrować.
BigPEmu 1.12 Richard Whitehouse wydał BigPEmu 1.12
FujiNET firmware v1.3.0 Nowa wersja oprogramowania do interfejsu sieciowego FujiNET. Tym razem z obsługą TCP!
hatari 2.5.0 Od dwóch dni dostępna jest najnowsza (2.5.0) wersja Hatari.
Grawitacja 2024 Czas na kolejną edycję 8 bitowego GameJamu.
Tenebra na Atari ST/STE Wersja gry na duże atari.
Strony 1
Zaloguj się lub zarejestruj by napisać odpowiedź
Witam, jest jakiś odpowiednik (wzór przekształcenia) barwy RGB na kolor atarynki ?
Tablica z 256 kolorami atarki (np. paleta z emulatora). W pętli obliczasz odległość Twojego koloru to każdego z kolorów z palety i wybierasz ten, który jest najbliżej ;)
funkcja w Turbo Pascalu zwracająca kolor Atari, autorem jest Rocky
n/w kod wykorzystywany jest w G2F
function rgbRead(cl: Tcolor):byte;
var l, d, c, ma, mi, r2, g2, b2: integer;
h, lu1, lu2, lu3: real;
r, g, b: byte;
begin
ma:=0; mi:=0; h:=0; c:=0;
R:=GetRValue(cl) shr 4;
G:=GetGValue(cl) shr 4;
B:=GetBValue(cl) shr 4;
if (r=g) and (g=b) then begin rgbRead:=r; exit; end;
if (r>=g) and (r>=b) then ma:=r;
if (r<=g) and (r<=b) then mi:=r;
if (g>=r) and (g>=b) then ma:=g;
if (g<=r) and (g<=b) then mi:=g;
if (b>=g) and (b>=r) then ma:=b;
if (b<=g) and (b<=r) then mi:=b;
d:=ma-mi;
if d=1 then begin rgbRead:=mi; exit; end;
r2:=r*100; g2:=g*100; b2:=b*100;
if r=ma then h:=(g2-b2)/d
else
if g=ma then h:=200+((b2-r2)/d)
else
if b=ma then h:=400+((r2-g2)/d);
h:=h*0.6; if h<0 then h:=h+360;
lu1:=r*0.297;
lu2:=g*0.586;
lu3:=b*0.109;
l:=trunc(lu1+lu2+lu3);
case trunc(h) of
21..31: c:=15;
32..43: c:=14;
44..63: c:=13;
64..84: c:=12;
85..147: c:=11;
148..171: c:=10;
172..191: c:=9;
192..209: c:=8;
210..261: c:=7;
262..276: c:=6;
277..297: c:=5;
298..318: c:=4;
319..334: c:=3;
335..360: c:=2;
0..14: c:=2;
15..20: c:=1;
end;
rgbRead:=c shl 4+l;
end;
dzięki Tebe, jeszcze tylko się chciałem upewnić: shl 4 to przesunięcie w lewo o 4 bity, czyli <<4, a shr w prawo czyli >>4 ? a trunc upraszcza wynik do int-a ?
dobrze kombinujesz MAW
No to potrzebuję wsparcia, bo nie wiem, co prawidłowo powinna zwracać procedura Get[barwa]Value(cl) w liniach 10-12. Po przeniesieniu do flasha mam:
function rgbRead (cl:String):Number {
//
var rgbnumber:String = parseInt (((cl.indexOf ("#") != -1) ? cl.split ("#")[1] : cl.split ("0x")[1]), 16).toString (16);
var l, d, c, ma, mi, r2, g2, b2:Number;
var h, lu1, lu2, lu3:Number;
var r, g, b:Number;
//
rgbnumber = ((rgbnumber.length < 6) ? ("000000").substr (0, 6 - rgbnumber.length) : "") + rgbnumber;
//
ma = 0;
mi = 0;
h = 0;
c = 0;
//
r = parseInt (rgbnumber.substr (0, 2), 16);
g = parseInt (rgbnumber.substr (2, 2), 16);
b = parseInt (rgbnumber.substr (4, 2), 16);
//
trace ([rgbnumber, r.toString(16), g.toString(16), b.toString(16)]);
if ((r == g) && (g == b))
{
trace ("gs?");
return r;
}
if ((r >= g) && (r >= b))
{
ma = r;
}
if ((r <= g) && (r <= b))
{
mi = r;
}
if ((g >= r) && (g >= b))
{
ma = g;
}
if ((g <= r) && (g <= b))
{
mi = g;
}
if ((b >= g) && (b >= r))
{
ma = b;
}
if ((b <= g) && (b <= r))
{
mi = b;
}
//
d = ma - mi;
if (d == 1)
{
trace ("a?");
return mi;
}
//
r2 = r * 100;
g2 = g * 100;
b2 = b * 100;
if (r == ma)
{
h = (g2 - b2) / d;
}
else if (g == ma)
{
h = 200 + ((b2 - r2) / d);
}
else if (b == ma)
{
h = 400 + ((r2 - g2) / d);
}
h = h * 0.6;
if (h < 0)
{
h = h + 360;
}
lu1 = r * 0.297;
lu2 = g * 0.586;
lu3 = b * 0.109;
l = int (lu1 + lu2 + lu3);
//
var val = int (h);
trace (val);
//
if (val < 5)
{
c = 2;
}
else if (val < 21)
{
c = 1;
}
else if (val < 32)
{
c = 15;
}
else if (val < 44)
{
c = 14;
}
else if (val < 64)
{
c = 13;
}
else if (val < 85)
{
c = 12;
}
else if (val < 148)
{
c = 11;
}
else if (val < 172)
{
c = 10;
}
else if (val < 192)
{
c = 9;
}
else if (val < 210)
{
c = 8;
}
else if (val < 262)
{
c = 7;
}
else if (val < 277)
{
c = 6;
}
else if (val < 298)
{
c = 5;
}
else if (val < 319)
{
c = 4;
}
else if (val < 335)
{
c = 3;
}
else if (val < 360)
{
c = 2;
}
trace ([c,l]);
return (c << 4) + l;
}
trace (rgbRead ("0xefffff"));
i w output dostaję wynik większy od 255:
efffff,ef,ff,ff
180
9,248
392
Czy to jest prawidłowość (przekroczenie wartości zakresu ze względu na złe odwzorowanie R), czy też ja znowu coś pomieszałem ? (ostatnia linia to wynik działania, poprzednie to wynik trace'ów
//EDIT: po godzinie googlania dochodzę do wniosku, że parseInt(rgbvalue.substr(pozycja, długość),16) zwraca dokładnie to, co ma zwrócić, a więc nie tu jest problem
Ostatnio edytowany przez maw (2008-06-28 09:49:08)
przepuść to przez Free Pascal, będziesz mógł testować do woli
Strony 1
Zaloguj się lub zarejestruj by napisać odpowiedź
[ Wygenerowano w 0.063 sekund, wykonano 14 zapytań ]