1

首先,我知道在这个应用程序中不使用 python 将有助于加快我的代码速度。不幸的是,python 是我最熟悉的,我在这个项目上的时间有限。学习 C 或类似的东西对我的情况并不实用。

所以这是我的问题。我已将位图加载到 python 中并提取了像素数据,我将其存储为字符串形式的原始字节,例如:“143 200 30 -1”(这是一个值为 143 的字节,而不是写入所需的 3 个字符数字 143)。

我要做的是从字符串中删除每四个字节。第四个字节是 alpha 通道,我的应用程序不需要它。这是我到目前为止的代码,它获取了位于 blockY 和 blockX 位置的尺寸为 blockSizeX x blockSizeY 的图像的一部分,并在过程中去除了 alpha 通道:

def getScreenBlockFaster(bmpstr, imgWidth):
    pixelData = ''
    pixelCoord = (blockY * blockSizeY * imgWidth + blockSizeX * blockX)* 4
    for y in range(blockSizeY * 4):
        for x in range(0, blockSizeX * 4, 4):
            pixelCoord += x 
            pixelData += bmpstr[pixelCoord : pixelCoord + 3]
        pixelCoord += imgWidth * 4
    return pixelData

这有效,但需要很长时间(几乎一整秒)。我希望为这个应用程序获得 5-10 fps,而这部分代码本身就太慢了。我计划对这段代码进行多线程处理,这会在一定程度上缓解速度问题,但我认为这仍然太慢了。我正在寻找的是一种更快的方式来采样这个位图,以便我可以获取部分数据,但我需要快速完成。有什么建议么?

4

3 回答 3

3

这是使用的解决方案itertools

>>> def drop_alpha(s):
...     return ''.join(itertools.compress(
...             s, itertools.cycle([True, True, True, False])))
...
>>> drop_alpha('12345678')
'123567'

内部循环中没有解释代码,它是线性时间而不是二次的,所以它应该很快。如果您要进行比这更复杂的图像处理,那么值得研究各种可用的

于 2013-09-23T03:20:11.937 回答
0

至少不使用字符串连接会有所帮助,使用:

pixelData = []
...
for y in range (blockSizeY * 4):
  ...
  pixelData.extend(bmpstr[pixelCoord : pixelCoord + 3])
...
return "".join(pixelData)

(并删除初始化和引用旧字符串 pixelData 变量的其他地方)

但是,这似乎在加载时效率会更高——无论您使用什么库来加载图像,加载时都可以删除 alpha 通道(或者进行可能在 C 中实现的内部转换)?

于 2013-09-23T03:18:35.520 回答
0

我不知道这会有多快,但是如果您转换为数组,则删除变得容易:

>>> s = "rgba"*10
>>> s
'rgbargbargbargbargbargbargbargbargbargba'
>>> import array
>>> a = array.array('c', s)
>>> a
array('c', 'rgbargbargbargbargbargbargbargbargbargba')
>>> del a[3::4]
>>> a
array('c', 'rgbrgbrgbrgbrgbrgbrgbrgbrgbrgb')

一个更好的解决方案是尼克巴斯汀对其他答案之一的评论:只需使用 PIL 进行图像处理。

于 2013-09-23T09:52:04.617 回答