sRGB转0-255线性标准RGB的Python实现问题
sRGB转线性RGB的正确Python实现
你的问题核心在于对颜色值范围的处理,以及可能混淆了转换方向。先明确标准转换逻辑:
标准sRGB转线性RGB(0-255范围)
如果你的输入是0-255的sRGB值,需要先归一化到0-1区间,转换后再转回0-255:
def srgb_to_linear_rgb(srgb_value): s = srgb_value / 255.0 if s <= 0.0404482362771082: lin = s / 12.92 else: lin = pow(((s + 0.055) / 1.055), 2.4) return round(lin * 255)
如果输入是0-1的sRGB值,直接转换到0-255线性RGB:
def srgb01_to_linear255(s): if s <= 0.0404482362771082: lin = s / 12.92 else: lin = pow(((s + 0.055) / 1.055), 2.4) return round(lin * 255)
测试输入0.4(0-1 sRGB),得到结果33,这是完全符合sRGB标准转换的正确值。
为什么你需要59?可能的混淆点
如果你的目标是线性RGB转sRGB(而非sRGB转线性),对应的实现是:
def linear_rgb_to_srgb(linear_value): lin = linear_value / 255.0 if lin <= 0.0031308: srgb = lin * 12.92 else: srgb = 1.055 * pow(lin, 1/2.4) - 0.055 return round(srgb * 255)
另一种可能是你误将非标准伽马校正(如伽马1.5/1.8)的结果作为参考,但这不符合sRGB的官方转换规范。标准sRGB转换的伽马曲线是分段的,并非单一伽马值。
结论
标准sRGB转线性RGB的结果就是33(对应0.4的0-1 sRGB),如果你的需求是标准转换,只需在原函数基础上添加范围转换步骤。若坚持需要59,则需要确认转换方向或是否使用了非标准的颜色空间参数。
内容的提问来源于stack exchange,提问作者Mike Kelley
相关产品推荐
相关产品推荐

