102 lines
2.9 KiB
Python
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) |