1

Witam, jest jakiś odpowiednik (wzór przekształcenia) barwy RGB na kolor atarynki ?

___
Press play on tape...

2

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 ;)

3

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;
*- TeBe/Madteam
3x Atari 130XE, SDX, CPU 65816, 2x VBXE, 2x IDE Plus rev. C

4

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 ?

___
Press play on tape...

5

dobrze kombinujesz MAW

*- TeBe/Madteam
3x Atari 130XE, SDX, CPU 65816, 2x VBXE, 2x IDE Plus rev. C

6 Ostatnio edytowany przez maw (2008-06-28 09:49:08)

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

___
Press play on tape...

7

przepuść to przez Free Pascal, będziesz mógł testować do woli

*- TeBe/Madteam
3x Atari 130XE, SDX, CPU 65816, 2x VBXE, 2x IDE Plus rev. C