When output to the monitor, the color 0xRRGGBB is approximated to the palette set in the monitor. I need to know exactly which color I will get through gpu.get when outputting color 0xRRGGBB.
Can you answer (or show example on the Lua): What algorithm is used to approximate colors?
Sorry for the bad english.
-=-
Below, just a small program that I use to test colors. Maybe it will be useful to someone.
sicot.lua "SimpleColorTester", "MC 1.12.2", "OpenComputers version 1.7.0.4", "Lua 5.3"
local gpu=require('component').gpu
local ev=require('event')localfunction setColor(f,b)
gpu.setForeground(f)
gpu.setBackground(b)endlocal w=0xFFFFFFrequire('term').clear()
gpu.fill(1,1,80,12," ")
gpu.set(27,1,'← click →')
gpu.set(69,1,' RMB to exit')
gpu.set(69,3,'◄ Tier 2')
gpu.set(69,5,'◄ Tier 3')
gpu.set(69,6,' ▼')localfunction showcolor(c)for i=0,24dolocal b=(c &2^i)>> i
setColor((1-b)*w, b*w)
gpu.set(24-i,1,tostring(b))end
setColor(c ~ w, c)
gpu.fill(1,3,24,3," ")
gpu.set(7,4,string.format('Set: %06X',c))local _,_,bg=gpu.get(1,3)
gpu.set(7,5,string.format('Get: %06X',bg))
setColor(w,0)
gpu.set(1,2,'└──┴┴──┘└──┴┴──┘└──┴┴──┘')endlocal color=math.random(w)
showcolor(color)local s='SimpleColorTest'for i=1,#s do
setColor(color ~ w, color)
gpu.set(36+i*2,1,string.sub(s,i,i)..' ')
color=math.random(w)end--[[ https://en.wikipedia.org/wiki/List_of_software_palettes#6-8-5_levels_RGBTier3 palette is constructed with six levels for red, eight levels for green and five levels for the blue primaries,
giving 6×8×5=240 combinations.The index can be addressed by(40×R)+(5×G)+B,with R ranging from0 to 5, G from0 to 7and B from0 to 4.Levels are chosen infunction of sensibility of the normal human eye to every primary color.]]--Tier2: safe colors,usethisif you need that your program look the same on tier2 and tier3 monitors
palTier2={0x000000,0x333333,0x333399,0x336600,0x336699,0x33CC33,0x663300,0x6699FF,0x9933CC,0xCC66CC,0xCCCCCC,0xFF3333,0xFF6699,0xFFCC33,0xFFFF33,0xFFFFFF}--alternative palettes
palCGA={0x000000,0x0000AA,0x00AA00,0x00AAAA,0xAA0000,0xAA00AA,0xAA5500,0xAAAAAA,0x555555,0x5555FF,0x55FF55,0x55FFFF,0xFF5555,0xFF55FF,0xFFFF55,0xFFFFFF}
palRGBI={0x000000,0x0000AA,0x00AA00,0x00AAAA,0xAA0000,0xAA00AA,0xAAAA00,0xAAAAAA,0x555555,0x5555FF,0x55FF55,0x55FFFF,0xFF5555,0xFF55FF,0xFFFF55,0xFFFFFF}
palZX={0x000000,0x0000CD,0xCD0000,0xCD00CD,0x00CD00,0x00CDCD,0xCDCD00,0xCDCDCD,0x000000,0x0000FF,0xFF0000,0xFF00FF,0x00FF00,0x00FFFF,0xFFFF00,0xFFFFFF}
pal7f={0x000000,0x000080,0x008000,0x008080,0x800000,0x800080,0x808000,0x808080,0x1f1f1f,0x1f1fFF,0x1fFF1f,0x1fFFFF,0xFF1f1f,0xFF1fFF,0xFFFF1f,0xFFFFFF}--show getPaletteColor(0..15)for x=0,7dofor y=0,1dolocal c=gpu.getPaletteColor(x+y*8)
setColor(w,c)
gpu.set(1+x*10,14+y,' ')
setColor(w,0)
gpu.set(1+x*10+3,14+y,string.format('%06X',c))endend--show Tier2 safe colors
for x=0,15do
setColor(w,palTier2[x+1])
gpu.set(36+2*x,3,' ')end--show Tier3,bydefault16 shades of gray
for y=0,0xFdo
setColor(w,(y+1)*0x0f0f0f)
gpu.set(36+y*2,5,' ')end--Tier3: big palette 6r*8g*5b=240fixed colors (approximately) are generated by the following algorithm
for r=0,5dofor g=0,7dofor b=0,4do
setColor(w, r*0x330000+ g*0x2400+ b*0x3F)
gpu.set(1+2*(b+g*5),7+r,' ')endendend--for greater accuracy it is necessary to use tables
-- RR ={0x00,0x33,0x66,0x99,0xCC,0xFF}-- GG ={0x00,0x24,0x49,0x6D,0x92,0xB6,0xDB,0xFF}-- BB ={0x00,0x40,0x80,0xC0,0xFF}--and formula color = RR[r]<<16+ GG[g]<<8+ BB[b]--when r =1..6; g =1..8; b =1..5local t=ev.timer(1,function() setColor(w,0) gpu.set(69,1,'→RMB to exit') os.sleep(.05) gpu.set(69,1,' RMB to exit')end, math.huge)
repeat
local _,_,x,y,k=ev.pull('touch')local s,fg,bg=gpu.get(x,y)if y==1and x<=24thenlocal bit=24-x
color = color ~2^bit
showcolor(color)else
color=bg
showcolor(color)end--temp test compute approximation
r =(color &0xFF0000)>>16
g =(color &0x00FF00)>>8
b = color &0x0000FF
r = r*6//256
g = g*8//256
b = b*5//256
RR={0x00,0x33,0x66,0x99,0xCC,0xFF}
GG={0x00,0x24,0x49,0x6D,0x92,0xB6,0xDB,0xFF}
BB={0x00,0x40,0x80,0xC0,0xFF}--temp show test
gpu.set(1+00,16,string.format('%02X',RR[r+1]))
gpu.set(1+10,16,string.format('%02X',GG[g+1]))
gpu.set(1+20,16,string.format('%02X',BB[b+1]))until k==1
ev.cancel(t)
setColor(w,0)require('term').clear()
You can post now and register later.
If you have an account, sign in now to post with your account.
Note: Your post will require moderator approval before it will be visible.
Hello.
When output to the monitor, the color 0xRRGGBB is approximated to the palette set in the monitor. I need to know exactly which color I will get through gpu.get when outputting color 0xRRGGBB.
Can you answer (or show example on the Lua): What algorithm is used to approximate colors?
Sorry for the bad english.
-=-
Below, just a small program that I use to test colors. Maybe it will be useful to someone.
sicot.lua "SimpleColorTester", "MC 1.12.2", "OpenComputers version 1.7.0.4", "Lua 5.3"
Link to post
Share on other sites