我有兴趣找到一种从定义的查找表中查找线性插值颜色的快速方法。目的是在运行时根据给定的颜色映射为大量项目指定颜色。色彩映射查找表是包含值(升序),红色,绿色,蓝色,不透明度的元组列表
下面是一个标准python的简单配方。 我也可以使用熊猫,因为我也在使用它。
# Interpolate colors from a lookup table
import bisect
def find_color(x, vlist, lut):
"""Finds linearly interpolated color from specified lut and x
Returns RGBA tuple
Parameters
x: value to lookup
vlist: list of values in lut
lut: List of tuples Value, R, G, B, A
"""
last = len(lut) - 1 # last index for lut
if x <= vlist[0] : #clamp low end
return lut[0][1], lut[0][2], lut[0][3], lut[0][4]
elif x >= vlist[last]: #clamp high end
return lut[last][1], lut[last][2], lut[last][3], lut[last][4]
else:
# since vlist is sorted we can use bisect
hi = bisect.bisect_left(vlist, x) #hi index
lo = hi - 1 # lo index
# interpolation weight from left
w = ( x - vlist[lo] ) / (vlist[hi] -vlist[lo] )
#print x, lo, hi, w
# use w to interpolate r,g,b,a from lo and hi bins
# interpolated_value = low_value + w * bin_size
r = lut[lo][1] + w * (lut[hi][1] - lut[lo][1])
g = lut[lo][2] + w * (lut[hi][2] - lut[lo][2])
b = lut[lo][3] + w * (lut[hi][3] - lut[lo][3])
a = lut[lo][4] + w * (lut[hi][4] - lut[lo][4])
return int(r), int(g), int(b), int(a)
# Color lookup table
lut = [ (0.0, 255, 0, 0, 64),
(0.5, 0, 255, 255,128),
(1.0, 0, 0, 255, 255) ]
# Value list - extract first column from lut
vlist = [ x[0] for x in lut]
# Test find_color() for arbitrary value
for i in xrange(-5, 12):
x = i/10.0
print find_color(x, vlist, lut)
答案 0 :(得分:0)
如果您可以提前预处理查找表,则可以使用简单查找替换二进制搜索+插值。只要你愿意接受不完全准确的输出的可能性,这应该是颜色的情况 - 一个错误很难被发现。
获取值并将其乘以某个常量,然后转换为整数,并将该整数用作列表的索引。
$attributes['mobile'] = array($AD_mobile);