0/前言

工作中遇到了要更改配色方案的需求,然而目前的项目所有的配色是写在一个xml表里面的,大致结构是这样的:

ID IsFillPart1 IsAddColorFirst1 ColorAddFirst1 HOffset1 SOffset1 VOffset1 IsFillPart2 IsAddColorFirst2 ColorAddFirst2 HOffset2 SOffset2 VOffset2 IsFillPart3 IsAddColorFirst3 ColorAddFirst3 HOffset3 SOffset3 VOffset3 IsFillPart4 IsAddColorFirst4 ColorAddFirst4 HOffset4 SOffset4 VOffset4 IsFillPart5 IsAddColorFirst5 ColorAddFirst5 HOffset5 SOffset5 VOffset5
1601 False False 0,0,0,0 0.56 0.35 0.24 False False 0,0,0,0 0.57 0.2 0.26 False False 0,0,0,0 0.63 0.09 0.14 False False 0,0,0,0 0.54 -0.1 0.02 False False 0,0,0,0 0 0 0
1603 True False 0,0,0,0 0.81 0.46 0.15 False False 0,0,0,0 0 0 0 False False 0,0,0,0 0 0 0 False False 0,0,0,0 0 0 0 False False 0,0,0,0 0 0 0

说句实在话,我看见这一堆堆的数字就头疼,更何况这些数据没有代码高亮来划分区域,所以我就在想,既然是表示颜色的数据,为什么不干脆直接把rgb数值什么的转换成颜色展示出来呢?

1/看懂表

这些表都是人写出来的,所以只要你是个人就可以读懂。

别看这个表有这么一大堆字段,仔细看的话其实可以分类成下面的结构:

  • ID 顾名思义,表示染色方案的id
  • IsFillPartX 这里对应的是个布尔值,所以我觉得应该是角色身上编号为X的部位是否参与染色
  • IsAddColorFirstX 这里对应的也是个布尔值,初步推测是代表染色方案的颜色是否叠加在原有颜色上,不然就直接覆盖了。
  • ColorAddFirstX 这里对应的是颜色,格式为R,G,B,A,其中R,G,B代表红绿蓝,A代表透明度,但是这里的取值范围取值范围很奇怪,是0-1,正常的RGB取值是在0-255的,所以这里在后面用到的时候肯定要处理一下。
  • HOffsetX,SOffsetX,VOffsetX Offset的意思是偏移,去掉Offset之后这里的意义就很明显了,就是另一种颜色格式HSV(色相、饱和度、亮度)的偏移量

2/做计划

现在我们看懂这个表是什么意思之后,其实这个染色方案表是怎样运行的就能了解个大差不离了。那么我们应该怎么把它转成我们能看懂的具体颜色呢?我的想法是这样的

既然他有HSV偏移这个概念,那就是说颜色的混合过程就是先将RGB颜色转换成HSV颜色,之后再将HSV偏移量加上,最后可以转回RGB颜色。

3/具体代码实现

我的想法是先将数据整理一下从原来的表中拿出来,只保留我们需要的字段,之后再根据我们需要的字段处理成最后的颜色。

对于拿出数据这一块,我是用下面的代码实现的

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
import colorsys
import os
import openpyxl

def value2rgb(str):
temp = str.split(",")
temp[0] = int(float(temp[0])*255)
temp[1] = int(float(temp[1])*255)
temp[2] = int(float(temp[2])*255)
temp[3] = int(float(temp[3])*255)
return temp

path = r"你的表路径"
os.chdir(path)

workbook = openpyxl.load_workbook("rawdata.xlsx")
sheet = workbook['Sheet1']

sheetRange = sheet.dimensions

ids = sheet["A"]

for index in range(2, len(ids)):
curId = sheet.cell(index,1).value
content1 = ""
content2 = ""
content3 = ""
content4 = ""
content5 = ""

# 部位1
if(sheet.cell(index,2).value != "False"):
rgbValue = value2rgb(sheet.cell(index,4).value)
hsvValue = list(colorsys.rgb_to_hsv(rgbValue[0], rgbValue[1], rgbValue[2]))
Hoffset = float(sheet.cell(index,5).value)
Soffset = float(sheet.cell(index,6).value)
Voffset = float(sheet.cell(index,7).value)
# 把偏移加上
hsvValue[0] += Hoffset
hsvValue[1] += Soffset
hsvValue[2] += Voffset
rgbValue = colorsys.hsv_to_rgb(hsvValue[0], hsvValue[1], hsvValue[2])
content1 = "%d %d %d"%(rgbValue[0],rgbValue[1],rgbValue[2])
else:
content1 = "None"

# 部位2
if(sheet.cell(index,8).value != "False"):
rgbValue = value2rgb(sheet.cell(index,10).value)
hsvValue = list(colorsys.rgb_to_hsv(rgbValue[0], rgbValue[1], rgbValue[2]))
Hoffset = float(sheet.cell(index,11).value)
Soffset = float(sheet.cell(index,12).value)
Voffset = float(sheet.cell(index,13).value)
# 把偏移加上
hsvValue[0] += Hoffset
hsvValue[1] += Soffset
hsvValue[2] += Voffset
rgbValue = colorsys.hsv_to_rgb(hsvValue[0], hsvValue[1], hsvValue[2])
content2 = "%d %d %d"%(rgbValue[0],rgbValue[1],rgbValue[2])
else:
content2 = "None"
# 部位3
if(sheet.cell(index,14).value != "False"):
rgbValue = value2rgb(sheet.cell(index,16).value)
hsvValue = list(colorsys.rgb_to_hsv(rgbValue[0], rgbValue[1], rgbValue[2]))
Hoffset = float(sheet.cell(index,17).value)
Soffset = float(sheet.cell(index,18).value)
Voffset = float(sheet.cell(index,19).value)
# 把偏移加上
hsvValue[0] += Hoffset
hsvValue[1] += Soffset
hsvValue[2] += Voffset
rgbValue = colorsys.hsv_to_rgb(hsvValue[0], hsvValue[1], hsvValue[2])
content3 = "%d %d %d"%(rgbValue[0],rgbValue[1],rgbValue[2])
else:
content3 = "None"
# 部位4
if(sheet.cell(index,20).value != "False"):
rgbValue = value2rgb(sheet.cell(index,22).value)
hsvValue = list(colorsys.rgb_to_hsv(rgbValue[0], rgbValue[1], rgbValue[2]))
Hoffset = float(sheet.cell(index,23).value)
Soffset = float(sheet.cell(index,24).value)
Voffset = float(sheet.cell(index,25).value)
# 把偏移加上
hsvValue[0] += Hoffset
hsvValue[1] += Soffset
hsvValue[2] += Voffset
rgbValue = colorsys.hsv_to_rgb(hsvValue[0], hsvValue[1], hsvValue[2])
content4 = "%d %d %d"%(rgbValue[0],rgbValue[1],rgbValue[2])
else:
content4 = "None"
pass

# 部位5
if(sheet.cell(index,26).value != "False"):
rgbValue = value2rgb(sheet.cell(index,28).value)
hsvValue = list(colorsys.rgb_to_hsv(rgbValue[0], rgbValue[1], rgbValue[2]))
Hoffset = float(sheet.cell(index,29).value)
Soffset = float(sheet.cell(index,30).value)
Voffset = float(sheet.cell(index,31).value)
# 把偏移加上
hsvValue[0] += Hoffset
hsvValue[1] += Soffset
hsvValue[2] += Voffset
rgbValue = colorsys.hsv_to_rgb(hsvValue[0], hsvValue[1], hsvValue[2])
content5 = "%d %d %d"%(rgbValue[0],rgbValue[1],rgbValue[2])
else:
content5 = "None"
pass

print(str(curId)+'^'+content1+'^'+content2+'^'+content3+'^'+content4+'^'+content5)

一上来就看这么一大坨代码确实很吓人,我们不妨先做一下准备工作

3.1/前置知识

3.1.1/openpyxl模块

由于python原生不支持直接操作excel文档,所有就要用到这个模块.建议执行

1
pip install openpyxl

确保这个模块存在

3.1.2/colorsys模块

这个模块简而言之就是用来实现颜色格式转换的,rgb转hsv然后再转回来之类的,这好像是一个Python内置的模块.

3.2/具体代码实现

3.2.1/打开你的表