Python:PIL替换单个RGBA颜色

时间:2010-09-20 14:37:20

标签: python colors python-imaging-library

我已经看过这个问题:SO question并且似​​乎实现了一种非常类似的技术来替换包含alpha值的单一颜色:

c = Image.open(f)
c = c.convert("RGBA")
w, h = c.size
cnt = 0
for px in c.getdata():
    c.putpixel((int(cnt % w), int(cnt / w)), (255, 0, 0, px[3]))
    cnt += 1                                                                                                   

但是,这很慢。我在互联网上找到了this recipe,但到目前为止还没有成功使用它。

我要做的是拍摄由单一颜色,白色组成的各种PNG图像。每个像素是100%白色,具有各种α值,包括α= 0.我想要做的基本上是用新的设定颜色着色图像,例如#ff0000< 00-ff>。所以我的开始和结果图像看起来像这样,左边是我的起始图像,右边是我的结束图像(注意:背景已经变为浅灰色,所以你可以看到它,因为它实际上是透明的,你不会'能够看到左边的点。)

alt text

有更好的方法吗?

3 个答案:

答案 0 :(得分:43)

如果你有numpy,它提供了一种更快,更快的方式来操作PIL图像。

E.g:

import Image
import numpy as np

im = Image.open('test.png')
im = im.convert('RGBA')

data = np.array(im)   # "data" is a height x width x 4 numpy array
red, green, blue, alpha = data.T # Temporarily unpack the bands for readability

# Replace white with red... (leaves alpha values alone...)
white_areas = (red == 255) & (blue == 255) & (green == 255)
data[..., :-1][white_areas.T] = (255, 0, 0) # Transpose back needed

im2 = Image.fromarray(data)
im2.show()

编辑:这是一个缓慢的星期一,所以我想我会添加几个例子:

只是为了表明它只保留alpha值,这里是你的示例图像版本的结果,其中径向渐变应用于alpha通道:

原文:alt text

结果:alt text

答案 1 :(得分:6)

试试这个,在这个例子中,如果颜色不是白色,我们将颜色设置为黑色。

#!/usr/bin/python
from PIL import Image
import sys

img = Image.open(sys.argv[1])
img = img.convert("RGBA")

pixdata = img.load()

# Clean the background noise, if color != white, then set to black.

for y in xrange(img.size[1]):
    for x in xrange(img.size[0]):
        if pixdata[x, y] == (255, 255, 255, 255):
            pixdata[x, y] = (0, 0, 0, 255)

你可以在gimp中使用颜色选择器来吸收颜色并看到它的rgba颜色

答案 2 :(得分:3)

Image module的Pythonware PIL在线书籍章节规定putpixel()很慢并且暗示它可以通过内联来加速。或者取决于PIL版本,改为使用load()。