在 python3 中将 hsl 转换为十六进制
Converting hsl to hex in python3
我从 atom one-dark syntax 中获取以下字符串:
one_dark_syn = """
@hue-1: hsl(187, 47%, 55%); // <-cyan
@hue-2: hsl(207, 82%, 66%); // <-blue
@hue-3: hsl(286, 60%, 67%); // <-purple
@hue-4: hsl( 95, 38%, 62%); // <-green
@hue-5: hsl(355, 65%, 65%); // <-red 1
@hue-5-2: hsl( 5, 48%, 51%); // <-red 2
@hue-6: hsl( 29, 54%, 61%); // <-orange 1
@hue-6-2: hsl( 39, 67%, 69%); // <-orange 2
"""
我想使用 python 将 hsl 值交换为十六进制。到目前为止,我编造了一组看起来很讨厌的循环来将值解析成一个 numpy 数组:
od_colors = [i.split(";")[0].split(":")[1] for i in one_dark_syn.split("\n") if "hsl" in i]
od_colors = [i.strip().replace("%","").replace("hsl","").replace(" ","") for i in od_colors]
od_colors = [i.replace("(","").replace(")","").split(",") for i in od_colors]
od_colors = np.array(od_colors,dtype="int32")
看来我说的很讨厌。有没有人有更 pythonic 的解析方法?最重要的是,您建议我如何将 hsl 转换为十六进制?
我会使用正则表达式:
regex = r'hsl\(\s*(\d+),\s*(\d+)%,\s*(\d+)%\s*\);'
lines = [re.findall(regex,line) for line in one_dark_syn.split('\n')]
rgbs = [colorsys.hsv_to_rgb(int(line[0][0])/360,
int(line[0][1])/100,
int(line[0][2])/100) for line in lines if line]
# [(0.2915, 0.519842, 0.55), (0.1188, 0.41646, 0.66), (0.5762, 0.268, 0.67),
# (0.48257, 0.62, 0.3844), (0.65, 0.2275, 0.2627), (0.51, 0.2856, 0.2652),
# (0.61, 0.43981, 0.2806), (0.69, 0.528195, 0.2277)]
最后,将 RGB 三元组转换为 HEX 字符串:
rgbhex = ["".join("%02X" % round(i*255) for i in rgb) for rgb in rgbs]
# ['1D3437', '0C2A42', '3A1B43', '303E26', '41171A', '331D1B', '3D2C1C', '453517']
谢谢@DYZ:
import re
import colorsys
json = '''
```json
{
"variables":
{
"blue": "hsl(210, 50%, 60%)",
"blue2": "hsl(180, 36%, 54%)",
"green": "hsl(114, 31%, 68%)",
"grey": "hsl(0, 0%, 73%)",
"grey2": "hsl(0, 0%, 60%)",
"grey3": "hsl(0, 0%, 20%)",
"orange": "hsl(32, 93%, 66%)",
"orange2": "hsl(32, 85%, 55%)",
"orange3": "hsl(40, 94%, 68%)",
"pink": "hsl(300, 30%, 68%)",
"red": "hsl(357, 79%, 65%)",
"red2": "hsl(13, 93%, 66%)",
"red3": "hsl(16, 29%, 54%)",
"white": "hsl(0, 0%, 97%)",
"white2": "hsl(210, 11%, 85%)",
"white3": "hsl(204, 10%, 90%)",
"white4": "hsl(195, 11%, 93%)",
"white5": "hsl(180, 9%, 98%)"
}
}
'''
regex = r'hsl\(\s*(\d+),\s*(\d+)%,\s*(\d+)%\s*\)'
lines = re.findall(regex,json)
rgbs = [colorsys.hls_to_rgb(int(line[0])/360,int(line[2])/100,int(line[1])/100) for line in lines]
hexs = ['#%02x%02x%02x'%(round(rgb[0]*255),round(rgb[1]*255),round(rgb[2]*255)) for rgb in rgbs]
print(hexs)
我从 atom one-dark syntax 中获取以下字符串:
one_dark_syn = """
@hue-1: hsl(187, 47%, 55%); // <-cyan
@hue-2: hsl(207, 82%, 66%); // <-blue
@hue-3: hsl(286, 60%, 67%); // <-purple
@hue-4: hsl( 95, 38%, 62%); // <-green
@hue-5: hsl(355, 65%, 65%); // <-red 1
@hue-5-2: hsl( 5, 48%, 51%); // <-red 2
@hue-6: hsl( 29, 54%, 61%); // <-orange 1
@hue-6-2: hsl( 39, 67%, 69%); // <-orange 2
"""
我想使用 python 将 hsl 值交换为十六进制。到目前为止,我编造了一组看起来很讨厌的循环来将值解析成一个 numpy 数组:
od_colors = [i.split(";")[0].split(":")[1] for i in one_dark_syn.split("\n") if "hsl" in i]
od_colors = [i.strip().replace("%","").replace("hsl","").replace(" ","") for i in od_colors]
od_colors = [i.replace("(","").replace(")","").split(",") for i in od_colors]
od_colors = np.array(od_colors,dtype="int32")
看来我说的很讨厌。有没有人有更 pythonic 的解析方法?最重要的是,您建议我如何将 hsl 转换为十六进制?
我会使用正则表达式:
regex = r'hsl\(\s*(\d+),\s*(\d+)%,\s*(\d+)%\s*\);'
lines = [re.findall(regex,line) for line in one_dark_syn.split('\n')]
rgbs = [colorsys.hsv_to_rgb(int(line[0][0])/360,
int(line[0][1])/100,
int(line[0][2])/100) for line in lines if line]
# [(0.2915, 0.519842, 0.55), (0.1188, 0.41646, 0.66), (0.5762, 0.268, 0.67),
# (0.48257, 0.62, 0.3844), (0.65, 0.2275, 0.2627), (0.51, 0.2856, 0.2652),
# (0.61, 0.43981, 0.2806), (0.69, 0.528195, 0.2277)]
最后,将 RGB 三元组转换为 HEX 字符串:
rgbhex = ["".join("%02X" % round(i*255) for i in rgb) for rgb in rgbs]
# ['1D3437', '0C2A42', '3A1B43', '303E26', '41171A', '331D1B', '3D2C1C', '453517']
谢谢@DYZ:
import re
import colorsys
json = '''
```json
{
"variables":
{
"blue": "hsl(210, 50%, 60%)",
"blue2": "hsl(180, 36%, 54%)",
"green": "hsl(114, 31%, 68%)",
"grey": "hsl(0, 0%, 73%)",
"grey2": "hsl(0, 0%, 60%)",
"grey3": "hsl(0, 0%, 20%)",
"orange": "hsl(32, 93%, 66%)",
"orange2": "hsl(32, 85%, 55%)",
"orange3": "hsl(40, 94%, 68%)",
"pink": "hsl(300, 30%, 68%)",
"red": "hsl(357, 79%, 65%)",
"red2": "hsl(13, 93%, 66%)",
"red3": "hsl(16, 29%, 54%)",
"white": "hsl(0, 0%, 97%)",
"white2": "hsl(210, 11%, 85%)",
"white3": "hsl(204, 10%, 90%)",
"white4": "hsl(195, 11%, 93%)",
"white5": "hsl(180, 9%, 98%)"
}
}
'''
regex = r'hsl\(\s*(\d+),\s*(\d+)%,\s*(\d+)%\s*\)'
lines = re.findall(regex,json)
rgbs = [colorsys.hls_to_rgb(int(line[0])/360,int(line[2])/100,int(line[1])/100) for line in lines]
hexs = ['#%02x%02x%02x'%(round(rgb[0]*255),round(rgb[1]*255),round(rgb[2]*255)) for rgb in rgbs]
print(hexs)