我有一个循环遍历图像的python代码并将它们复制到RGBA格式的数组中,但代码速度非常慢,每个256x256的10个图像处理时间超过5分钟,任何想法如何改进此代码?
self.pixelsArray = array('B')
def extractPixelsFromImage(self):
pixels = self.image.pixels
for y in range(self.height):
for x in range(self.width):
i = (x + (self.height-1-y)*self.width) * 4
r = int (max (0, min (255, 255 * pixels [i ])))
g = int (max (0, min (255, 255 * pixels [i + 1])))
b = int (max (0, min (255, 255 * pixels [i + 2])))
a = int (max (0, min (255, 255 * pixels [i + 3])))
self.pixelsArray.append(r)
self.pixelsArray.append(g)
self.pixelsArray.append(b)
self.pixelsArray.append(a)
答案 0 :(得分:3)
您可以做一点改进,而不是追加四次 r , g , b 和 a 到数组,创建一个列表并使用extend方法,如下所示:
self.pixels_array = array('B')
def extract_pixels_from_image(self):
pixels = self.image.pixels
for y in range(self.height):
for x in range(self.width):
i = (x + (self.height - 1 - y) * self.width) * 4
r = int(max(0, min(255, 255 * pixels[i])))
g = int(max(0, min(255, 255 * pixels[i + 1])))
b = int(max(0, min(255, 255 * pixels[i + 2])))
a = int(max(0, min(255, 255 * pixels[i + 3])))
self.pixels_array.extend([r, g, b, a])
很抱歉更改您的命名风格,只是不要在变量和方法名称中使用驼峰大小写样式不是 pythonic 。
答案 1 :(得分:0)
我要尝试的第一件事就是用range
替换xrange
,只要你不需要内存中的整个数组。
范围创建一个列表,因此如果你执行范围(1,10000000),它会在内存中创建一个包含10000000个元素的列表。
xrange是一个懒惰评估的序列对象。
(source)