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ć.
Echa Sommarhack 2025 Podczas szwedzkiego party Sommarhack zaprezentowano kilkadziesiąt produkcji,
MadPascal 1.7.3 już dostępny Nowa wersja kompilatora MadPascal przynosi poprawki i optymalizacje
Echa Lost Party 2025 Wyniki, zapis wideo oraz stuff.
Lost Party 2025 startuje już jutro W Licheniu Starym rusza zlot fanów 8-bitowych komputerów
zeST 20250627 - Atari ST w FPGA z turbo! Nowa wersja zeST z trybem turbo 50 MHz i poprawkami Shiftera i MFP
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.015 sekund, wykonano 61 zapytań