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ć.
TURGEN 9.3.0 Kolejna wersja multiplatformowego narzędzia do zarządzania obrazami taśm.
SV 2024 WE - program imprezy Już za tydzień odbędzie się zimowa edycja Silly Venture
Nowa obudowa dla 800XL - zostało 36 dni Niewiele ponad miesiąc do końca kampanii.
Zmarł twórca języka BASIC Zmarł Thomas E. Kurtz twórca języka BASIC
Zmiana serwera atari.area Serwis przeszedł właśnie ważną aktualizację infrastruktury
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.023 sekund, wykonano 50 zapytań