Skip to main content
 首页 » 编程设计

python之使用python高效处理RGBA数据

2025年05月04日19tintown

我正在尝试处理一个 RGBA 缓冲区(字符列表),并在每个像素上运行“unpremultiply”。算法是color_out=color*255/alpha。

这是我想出的:

def rgba_unpremultiply(data): 
    for i in range(0, len(data), 4): 
        a = ord(data[i+3]) 
        if a != 0: 
            data[i] = chr(255*ord(data[i])/a) 
            data[i+1] = chr(255*ord(data[i+1])/a) 
            data[i+2] = chr(255*ord(data[i+2])/a) 
    return data 

它可以工作,但会导致性能上的重大缺陷。

我想知道除了编写 C 模块之外,我还有哪些选项可以优化此特定功能?

请您参考如下方法:

这正是那种代码NumPy非常适合。

import numpy 
 
def rgba_unpremultiply(data): 
    a = numpy.fromstring(data, 'B') # Treat the string as an array of bytes 
    a = a.astype('I') # Cast array of bytes to array of uints, since temporary values needs to be larger than byte 
    alpha = a[3::4] # Every 4th element starting from index 3 
    alpha = numpy.where(alpha == 0, 255, alpha) # Don't modify colors where alpha is 0 
    a[0::4] = a[0::4] * 255 // alpha # Operates on entire slices of the array instead of looping over each element 
    a[1::4] = a[1::4] * 255 // alpha 
    a[2::4] = a[2::4] * 255 // alpha 
    return a.astype('B').tostring() # Cast back to bytes