pix_color = (180, 100, 50) cmy_adjust = (40, -60, 10) ref = ({ # reds 'range': 180-100, 'values': ( (204, 149, 114), (204, 149, 114), (204, 149, 112), (204, 149, 104), (204, 149, 95), (204, 149, 86), (193, 149, 77), (182, 149, 69), (170, 149, 60), (159, 149, 51), (148, 148, 42), (137, 145, 34), (126, 142, 34), (124, 138, 34), (124, 135, 34), (124, 132, 34), (124, 129, 34), (124, 126, 34), (124, 122, 34), (124, 119, 34), (124, 116, 34), ) },{ # neutrals 'range': (255*2-(abs((180*2)-255)+abs((50*2)-255))+1)/2, 'values': ( (217, 176, 150), (217, 176, 150), (217, 176, 148), (217, 176, 134), (217, 176, 120), (217, 176, 106), (200, 176, 93), (182, 176, 79), (165, 176, 65), (148, 176, 51), (130, 175, 37), (112, 170, 25), ( 95, 165, 25), ( 92, 160, 25), ( 92, 155, 25), ( 92, 150, 25), ( 92, 145, 25), ( 92, 140, 25), ( 92, 135, 25), ( 92, 130, 25), ( 92, 125, 25), ) }) def clip(v, min_v, max_v): if v < min_v: return min_v if v > max_v: return max_v return v def comp_adjust(adjust_range, value, adjust, k): # FIXME: how to use k? :( adjust += k # XXX: incomplete/wrong left_pcent = value/255. right_pcent = 1. - value/255. return round(clip(-adjust, -left_pcent, right_pcent) * adjust_range) for x in ref: adjust_range = x['range'] k = -100 for values in x['values']: res = [comp_adjust(adjust_range, pix_color[i], cmy_adjust[i] / 100., k / 100.) for i in range(3)] ar, ag, ab = res rr, rg, rb = [values[i] - pix_color[i] for i in range(3)] print 'K %4d: RES{%4d %4d %4d} REF{%4d %4d %4d} ERR{%4d %4d %4d}' % (k, ar, ag, ab, rr, rg, rb, ar-rr, ag-rg, ab-rb) k += 10 print '---'