
|
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!!
|