2010-09-20 84 views
13

我已經採取了看看這個問題:SO question,似乎實現了一個非常類似的技術來取代單一的顏色,包括阿爾法值:的Python:PIL更換單個RGBA顏色

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 

然而,這非常緩慢。我在互聯網上發現了這個配方,但到目前爲止還沒有成功使用它:recipe

我想要做的是採取由單一顏色,白色組成的各種PNG圖像。每個像素都是100%白色,包含alpha = 0的各種alpha值。我想要做的是基本上用新的設置顏色着色圖像,例如#ff0000 < 00-ff>。因此,我的起始圖像和結果圖像看起來像這樣,左側是我的起始圖像,右側是我的結束圖像(注意:背景已更改爲淺灰色,因此您可以看到它,因爲它實際上是透明的, T爲能看到左邊的點。)

alt text

什麼更好的辦法來做到這一點?

回答

32

如果你有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值,這裏的結果對於具有徑向梯度的版本的示例圖像的施加到α通道:

原件:alt text

結果:alt text

+1

真棒!真棒!真棒! +1並標記爲「已接受」。巨大的時間節省和結果是完美的。 – sberry 2010-09-21 13:48:28

+0

@sberry - 很高興幫助! – 2010-09-21 14:44:32

+0

應該不是,紅綠藍? white_areas = – Sekai 2014-12-18 19:29:39

2

Image module的Pythonware PIL在線書籍章節規定putpixel()速度較慢,並且暗示它可以通過內聯加速。或者取決於PIL版本,使用load()來代替。

2

試試這個,在本示例中,如果顏色不是白色,我們將顏色設置爲黑色。

#!/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顏色