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ć.
FujiNET firmware v1.5.0 Nowa wersja firmware, która wprowadza szereg ulepszeń i poprawek.
Prima Aprilis Compo 2025 Wystartowała nowa edycja Prima Aprilis Compo, w której obowiązuje jedno wyzwanie - piszemy wyłącznie w Atari BASIC.
maxYMiser FM v1.67 Nowa wersja trackera.
Echa Forevera 23 Wyniki konkursów dla platformy Atari.
Atari Font Maker V1.16.14.4 Narzędzie do projektowania zestawów znaków dla Atari właśnie otrzymało aktualizację
atari.area forum » Programowanie - 8 bit » 0..255 == 0x [rr gg bb] RGB ?
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
przepuść to przez Free Pascal, będziesz mógł testować do woli
Strony 1
Zaloguj się lub zarejestruj by napisać odpowiedź
atari.area forum » Programowanie - 8 bit » 0..255 == 0x [rr gg bb] RGB ?
Wygenerowano w 0.040 sekund, wykonano 23 zapytań