现在,我有将R,G和B颜色值转换为十六进制的代码。
但是,如果用户输入无效数字(例如-20),它将返回一个完全随机的数字。
我的代码是:
def rgb(r, g, b):
if r < 0:
r = 0
elif r > 255:
r = 255
if g < 0:
g = 0
elif g > 255:
g = 255
if b < 0:
b = 0
elif b > 255:
b = 255
return '%02x%02x%02x'.upper() % (r,g,b)
但是,我不想放置所有if / elif语句,因为它们占用了太多空间。是否有可能像r.range(0,255)那样将无效数字更改为最接近的数字?例如,-20将更改为0,而300将更改为255。
任何帮助都将不胜感激。
答案 0 :(得分:3)
我认为大多数人使用的成语对于某些value
来说是这样的:
maxValue = 255
minValue = 0
min(maxValue, max(minValue, value))
答案 1 :(得分:2)
如果你想对它感兴趣,这很好用:
r, g, b = (min(255, max(0, c)) for c in (r, g, b))
示例:
In [1]: r, g, b = -1, 145, 289
In [2]: r, g, b = (min(255, max(0, c)) for c in (r, g, b))
In [3]: r, g, b
Out[3]: (0, 145, 255)
答案 2 :(得分:1)
如果您的值总是打包为&#34;列表般的&#34;结构(例如,元组,列表,numpy数组),然后考虑使用Numpy的clip
函数。然后,在以下示例中,您可以避免将值解压缩到变量r,g和b中。
#!/usr/bin/env python
import numpy as np
def clip(r, g, b, min_val=0, max_val=255):
return tuple(np.clip((r, g, b), min_val, max_val))
def main():
x = clip(-20, 1, 256)
print(x)
x = clip(0, 300, -1)
print(x)
x = clip(1, 100, 255)
print(x)
y = (-20, 1, 256)
y = clip(*y) # Unpack y into r, g, b, if you like
print(y)
if __name__ == '__main__':
main()
输出:
(0, 1, 255)
(0, 255, 0)
(1, 100, 255)
(0, 1, 255)