【发布时间】:2012-07-08 01:48:54
【问题描述】:
我有一个浮点数列表,它是图像像素数据。每 4 个浮点数构成一个 RGBA 像素。将该列表转换为 BGRA 格式(顺序)的最有效方法是什么?
我有什么:
[R, G, B, A, R, G, B, A]
我需要什么:
[B, G, R, A, B, G, R, A]
【问题讨论】:
我有一个浮点数列表,它是图像像素数据。每 4 个浮点数构成一个 RGBA 像素。将该列表转换为 BGRA 格式(顺序)的最有效方法是什么?
我有什么:
[R, G, B, A, R, G, B, A]
我需要什么:
[B, G, R, A, B, G, R, A]
【问题讨论】:
使用itertools 的石斑鱼配方
>>> from itertools import chain, izip_longest
>>> def grouper(n, iterable, fillvalue=None):
"Collect data into fixed-length chunks or blocks"
# grouper(3, 'ABCDEFG', 'x') --> ABC DEF Gxx
args = [iter(iterable)] * n
return izip_longest(fillvalue=fillvalue, *args)
>>> pixels = [70, 140, 210, 0.5, 60, 100, 200, 0.7]
>>> list(chain.from_iterable((b,g,r,a) for r,g,b,a in grouper(4, pixels)))
[210, 140, 70, 0.5, 200, 100, 60, 0.7]
【讨论】:
>>> v = [1,2,3,4,5,6,7,8]
>>> [v[a if a & 1 else a ^ 2] for a in range(len(v))]
[3, 2, 1, 4, 7, 6, 5, 8]
【讨论】:
from itertools import chain,izip
L = [1,2,3,4,1,2,3,4]
print list(chain(*((C,B,A,D) for A,B,C,D in izip(*[iter(L)]*4))))
【讨论】:
l 作为变量名,因为它可能与数字 1 混淆。使用L 或更好的名称。
不是很Pythonic,但可能很高效:
final = []
for i in range(len(data)/4):
final.extend(data[4*i:4*i+3][::-1])
final.append(data[4*i+3])
编辑:如果您可以就地修改列表,那将是完美的恕我直言:
for i in range(0, len(data), 4):
data[i:i+3] = data[i:i+3][::-1]
【讨论】:
3.24s,这运行在 8.52s。使用xrange 而不是range 将其降低到8.19s 并附加而不是使用带有反向切片的extend 需要7.38s