在 colormath 中将 LabColor 转换为 sRGBColor 会给出无效的十六进制
Converting LabColor to sRGBColor in colormath gives invalid hex
我有以下方法:
def labProcessColorSwatch(node, namespaces):
return {
"name": node.find(".//xmpG:swatchName", namespaces).text,
"color_type": node.find(".//xmpG:type", namespaces).text,
"tint": node.find(".//xmpG:tint", namespaces).text,
"source_type": node.find(".//xmpG:mode", namespaces).text,
"display": '',
"source": {
"L*": node.find(".//xmpG:L", namespaces).text,
"a*": node.find(".//xmpG:A", namespaces).text,
"b*": node.find(".//xmpG:B", namespaces).text,
}
}
def labToHex(swatch):
lab = LabColor(
lab_l = float(swatch["source"]["L*"]),
lab_a = float(swatch["source"]["a*"]),
lab_b = float(swatch["source"]["b*"])
)
rgb = convert_color(lab, sRGBColor)
return bitConvertHex(rgb) # rgb.get_rgb_hex()
使用 Xmp 数据源:
<rdf:li rdf:parseType="Resource">
<xmpG:swatchName>PANTONE 1505 C</xmpG:swatchName>
<xmpG:type>SPOT</xmpG:type>
<xmpG:tint>100.000000</xmpG:tint>
<xmpG:mode>LAB</xmpG:mode>
<xmpG:L>66.274513</xmpG:L>
<xmpG:A>59</xmpG:A>
<xmpG:B>93</xmpG:B>
</rdf:li>
给出:
sRGBColor(rgb_r=1.0543146152492686,rgb_g=0.42327948385100367,rgb_b=0.0)
set([0, 108, 269])
{'color_type': 'SPOT',
'display': '#10d6c00',
'name': 'PANTONE 1505 C',
'source': {'L*': '66.274513', 'a*': '59', 'b*': '93'},
'source_type': 'LAB',
'tint': '100.000000'}
为什么要计算 #10d6c00
十六进制值? 269 显然是错误的,但是 Lab,我没有理解这可能是错误的(除了关于缩放 L
或 R
值 0-255 > 0-100 的事情?)。
这是使用 colormath 2.1.1。
很简单,颜色超出了 sRGB 的可表示范围。切换到固定方法解决了问题:
def bitConvertHex(color):
# Scale up to 0-255 values.
rgb_r = int(math.floor(0.5 + color.clamped_rgb_r * 255))
rgb_g = int(math.floor(0.5 + color.clamped_rgb_g * 255))
rgb_b = int(math.floor(0.5 + color.clamped_rgb_b * 255))
return '#%02x%02x%02x' % (rgb_r, rgb_g, rgb_b)
感谢诺德兰人 Magnus 的提示。
我有以下方法:
def labProcessColorSwatch(node, namespaces):
return {
"name": node.find(".//xmpG:swatchName", namespaces).text,
"color_type": node.find(".//xmpG:type", namespaces).text,
"tint": node.find(".//xmpG:tint", namespaces).text,
"source_type": node.find(".//xmpG:mode", namespaces).text,
"display": '',
"source": {
"L*": node.find(".//xmpG:L", namespaces).text,
"a*": node.find(".//xmpG:A", namespaces).text,
"b*": node.find(".//xmpG:B", namespaces).text,
}
}
def labToHex(swatch):
lab = LabColor(
lab_l = float(swatch["source"]["L*"]),
lab_a = float(swatch["source"]["a*"]),
lab_b = float(swatch["source"]["b*"])
)
rgb = convert_color(lab, sRGBColor)
return bitConvertHex(rgb) # rgb.get_rgb_hex()
使用 Xmp 数据源:
<rdf:li rdf:parseType="Resource">
<xmpG:swatchName>PANTONE 1505 C</xmpG:swatchName>
<xmpG:type>SPOT</xmpG:type>
<xmpG:tint>100.000000</xmpG:tint>
<xmpG:mode>LAB</xmpG:mode>
<xmpG:L>66.274513</xmpG:L>
<xmpG:A>59</xmpG:A>
<xmpG:B>93</xmpG:B>
</rdf:li>
给出:
sRGBColor(rgb_r=1.0543146152492686,rgb_g=0.42327948385100367,rgb_b=0.0)
set([0, 108, 269])
{'color_type': 'SPOT',
'display': '#10d6c00',
'name': 'PANTONE 1505 C',
'source': {'L*': '66.274513', 'a*': '59', 'b*': '93'},
'source_type': 'LAB',
'tint': '100.000000'}
为什么要计算 #10d6c00
十六进制值? 269 显然是错误的,但是 Lab,我没有理解这可能是错误的(除了关于缩放 L
或 R
值 0-255 > 0-100 的事情?)。
这是使用 colormath 2.1.1。
很简单,颜色超出了 sRGB 的可表示范围。切换到固定方法解决了问题:
def bitConvertHex(color):
# Scale up to 0-255 values.
rgb_r = int(math.floor(0.5 + color.clamped_rgb_r * 255))
rgb_g = int(math.floor(0.5 + color.clamped_rgb_g * 255))
rgb_b = int(math.floor(0.5 + color.clamped_rgb_b * 255))
return '#%02x%02x%02x' % (rgb_r, rgb_g, rgb_b)
感谢诺德兰人 Magnus 的提示。