Python:PIL替换单个RGBA颜色

问题描述 投票:18回答:3

我已经看过这个问题: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%白色,具有各种alpha值,包括alpha = 0.我想要做的是基本上用新的设置颜色着色图像,例如#ff0000 <00-ff>。所以我的开始和结果图像看起来像这样,左边是我的起始图像,右边是我的结束图像(注意:背景已经变为浅灰色,所以你可以看到它,因为它实际上是透明的,你不会'能够看到左边的点。)

有更好的方法吗?

python colors python-imaging-library
3个回答
46
投票

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

例如:

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通道:

原版的:

结果:


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颜色


3
投票

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

© www.soinside.com 2019 - 2024. All rights reserved.