LuckyColorCalculator/colors.py
2022-06-30 23:07:10 +08:00

102 lines
2.9 KiB
Python

mc_colors = [
['红色染料', '#B02E26', 'red'],
['绿色染料', '#5E7C16', 'green'],
['紫色染料', '#8932B8', 'purple'],
['青色染料', '#169C9C', 'cyan'],
['淡灰色染料', '#9D9D97', 'silver'],
['灰色染料', '#474F52', 'gray'],
['粉红色染料', '#F38BAA', 'pink'],
['黄绿色染料', '#80C71F', 'lime'],
['黄色染料', '#FED83D', 'yellow'],
['淡蓝色染料', '#3AB3DA', 'lightBlue'],
['品红色染料', '#C74EBD', 'magenta'],
['橙色染料', '#F9801D', 'orange'],
['黑色染料', '#1D1D21', 'black'],
['棕色染料', '#835432', 'brown'],
['蓝色染料', '#3C44AA', 'blue'],
['白色染料', '#F9FFFE', 'white']
]
colornames = [
"red", "green", "purple", "cyan",
"silver", "gray", "pink", "lime",
"yellow", "lightBlue", "magenta", "orange",
"black", "brown", "blue", "white"
]
def encode_color(r, g, b):
color = '#{r}{g}{b}'.format(
r = hex(r)[2:].rjust(2, '0'),
g = hex(g)[2:].rjust(2, '0'),
b = hex(b)[2:].rjust(2, '0'),
)
return color
def decode_color(color:str):
color = color.strip('#')
color = int(color, base=16)
r = (color>>16) & 0xff
g = (color>>8) & 0xff
b = color & 0xff
return [r, g, b]
def parse_mc_color(colors):
parsed_color = {}
for color in colors:
name, value, key = color
assert len(value) == 7
r, g, b = decode_color(value)
parsed_color[key] = {
"name": name,
"key": key,
"value": [r, g, b]
}
return parsed_color
colors = parse_mc_color(mc_colors)
def calculate_fused_color(colors):
if len(colors) == 0:
return None
# calculate average color
avg_color = []
num_colors = len(colors)
for channel in zip(*colors):
channel_avg = sum(channel) // num_colors
avg_color.append(channel_avg)
# calculate gain factor.
avg_max = sum([max(x) for x in colors])/num_colors
max_avg = max(avg_color)
# print('avgcolor:', avg_color)
# print('avgmax:', avg_max)
# print('maxavg:', max_avg)
gain_factor = avg_max / max_avg
fused_color = [int(x*gain_factor) for x in avg_color]
return fused_color
def get_color_by_recipe(recipe, current_color=None):
color_list = []
for key, count in recipe.items():
if count > 0:
color_list += [colors[key]['value']]*count
if current_color is not None:
color_list.append(current_color)
return color_list
if __name__ == '__main__':
# color = get_color_by_recipe({
# "purple": 1,
# "blue": 1,
# "white": 6
# })
# print('color:', color)
# print(calculate_fused_color(color))
color = [123, 59, 71]
encoded = encode_color(*color)
decoded = decode_color(encoded)
print('color:', color)
print('encoded:', encoded)
print('decoded:', decoded)