RGB <> YJK Alex Wulms, 00-00-00 (Ik heb deze tekst eens van Alex Wulms gekregen, als reaktie op een vraag van mij - Roderik Muit) 4 horizontale pixels zijn in screen 12 als volgt gecodeerd: |C7 C6 C5 C4 C3|C2 C1 C0| ------+--------------+--------+ 1 dot | Y1 | Kl | 1 dot | Y2 | Kh | 1 dot | Y3 | Jl | 1 dot | Y4 | Jh | ------+--------------+--------+ K = KhKl is een 6-bits 2 complement getal J = JhJl is een 6-bits 2 complement getal Y1..Y4 zijn 5-bits unsigned getallen K en J zijn dus getallen met een sign (bit 6 is het sign bit). Dit houdt dus in dat de volgende conventie wordt gebruikt: K = 32 -> -32 wordt bedoeld K = 33 -> -31 wordt bedoeld . . . . . . K = 63 -> -1 wordt bedoeld K = 0 -> 0 wordt bedoeld K = 1 -> 1 wordt bedoeld . . . . . . K = 31 -> 31 wordt bedoeld Dezelfde conventie wordt bij J gebruikt. In basic kan daarom de volgende 'conversie' formule worden gebruikt (om 6-bits 2-complement om te zetten in 16 bits 2-complement ofwel integers): if k>32 then k=k-64 En op de Z80 (in assembler, neem aan: K zit in de Accu) mk8bits: cp 32 ; is het getal positief ? ret c ; ja => alles is goed sub 64 ; nee => zet om in 8-bits 2-complement ret Als je dit eenmaal hebt, kun je de volgende formules gebruiken: -Voor conversie van YJK naar RGB: R = Y+J G = Y+K B = (5/4)*Y - (J/2) - (K/4) Let op: R, G en B zijn in principe allemaal 5 bits. De uitkomsten kunnen echter te groot of te klein worden! Daarom dient hierop gecontroleerd te worden. Dit kan bijvoorbeeld als volgt (in basic): if r>31 then r=31 else if r<0 then r=0 if g>31 then g=31 else if g<0 then g=0 if b>31 then b=31 else if b<0 then b=0 -Voor de conversie van RGB naar YJK Y = B/2 + R/4 + G/8 J = R - Y (= (3/4)*R - B/2 - G/8, dus hier zit alles in gecodeerd) K = G - Y (= (7/8)*G - B-2 - R/4, dus ook hier zit alles in) In J en K zit dus alles (R, G em B) gecodeerd, alleen in andere verhoudingen!! |