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ć.
Atari Font Maker V1.16.14.4 Narzędzie do projektowania zestawów znaków dla Atari właśnie otrzymało aktualizację
Ruszyła strona Silly Venture 2k25SE Party place pozostaje bez zmian.
Zmarł mOdmate Zmarł mOdmate
Grawitacja 2025 Wyjątkowy hackathon, gdzie zespoły mają 36 godzin na stworzenie gry na dowolną platformę ośmiobitową.
Forever 2025 - już wkrótce! Coroczne spotkanie entuzjastów platform takich jak Atari, Commodore, ZX Spectrum oraz innych komputerów 8-bitowych.
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.017 sekund, wykonano 58 zapytań