title: 利用Python来将抽象的染色方案表转成人能看懂的颜色
date: 2024-07-02 16:11:04
tags: [Python, 基础知识]
categories: [工作经验]
cover: https://s21.ax1x.com/2024/07/02/pkg0Z6K.png
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
顾名思义,表示染色方案的idIsFillPartX
这里对应的是个布尔值,所以我觉得应该是角色身上编号为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/具体代码实现
我的想法是先将数据整理一下从原来的表中拿出来,只保留我们需要的字段,之后再根据我们需要的字段处理成最后的颜色。
对于拿出数据这一块,我是用下面的代码实现的
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文档,所有就要用到这个模块.建议执行
pip install openpyxl
确保这个模块存在
3.1.2/colorsys模块
这个模块简而言之就是用来实现颜色格式转换的,rgb转hsv然后再转回来之类的,这好像是一个Python内置的模块.