回答

15

如果numpy可以在您的計算機上,嘗試做這樣的事情:

import numpy as np 
from PIL import Image 

im = Image.open('fig1.png') 
data = np.array(im) 

r1, g1, b1 = 0, 0, 0 # Original value 
r2, g2, b2 = 255, 255, 255 # Value that we want to replace it with 

red, green, blue = data[:,:,0], data[:,:,1], data[:,:,2] 
mask = (red == r1) & (green == g1) & (blue == b1) 
data[:,:,:3][mask] = [r2, g2, b2] 

im = Image.fromarray(data) 
im.save('fig1_modified.png') 

它將使用一個位(3次)更多的內存,但它應該是相當大(〜5倍,但更多更大的圖片)更快。

另請注意,如果您只有RGB(而不是RGBA)圖像,則上述代碼稍微複雜一些。然而,這個例子將會使alpha帶單獨出現,而更簡單的版本則不會。

4

我剛剛想出了這個解決方案:

import Image 
im = Image.open("MyImage.png") 
width, height = im.size 
colortuples = im.getcolors() 
mycolor1 = min(colortuples)[1] 
mycolor2 = max(colortuples)[1] 
pix = im.load() 
for x in range(0, width): 
    for y in range(0, height): 
     if pix[x,y] == mycolor1: 
      im.putpixel((x, y), mycolor2) 
im.save('MyImage.png') 

雖然的putpixel並不快,這似乎是足夠快的我。

+0

的修改可能不會有所作爲速度明智的,但你可以做'PIX [X,Y] = mycolor2'而不是使用'im.putpixel()'。 – zeekay

+0

我試過這個,但由於打開圖像的模式('r'),我得到一個錯誤。我試過'Image.open(「MyImage.png」,「w」)',但它不起作用。我不知道如何使用'pix [x,y] = mycolor2' –

+0

不知道爲什麼它不起作用,也許是一個錯誤? – zeekay

2

這是對Joe Kington上面答案的修改。以下是如何在圖片包含Alpha通道的情況下執行此操作。

import numpy as np 
import Image 

im = Image.open('fig1.png') 
im = im.convert('RGBA') 
data = np.array(im) 

r1, g1, b1 = 0, 0, 0 # Original value 
r2, g2, b2, a2 = 255, 255, 255, 255 # Value that we want to replace it with 

red, green, blue, alpha = data[:,:,0], data[:,:,1], data[:,:,2], data[:,:,3] 
mask = (red == r1) & (green == g1) & (blue == b1) 
data[:,:,:4][mask] = [r2, g2, b2, a2] 

im = Image.fromarray(data) 
im.save('fig1_modified.png') 

我花了很長時間才弄清楚如何使它工作。我希望它能幫助別人。

0

該解決方案使用glob編輯文件夾中的所有png,刪除顏色並將其與另一個顏色交換,但使用RGBA。

import glob 
from PIL import Image 

old_color = 255, 0, 255, 255 
new_color = 0, 0, 0, 0 

for path in glob.glob("*.png"): 
    if "__out" in path: 
     print "skipping on", path 
     continue 

    print "working on", path 

    im = Image.open(path) 
    im = im.convert("RGBA") 
    width, height = im.size 
    colortuples = im.getcolors() 

    pix = im.load() 
    for x in xrange(0, width): 
     for y in xrange(0, height): 
      if pix[x,y] == old_color: 
       im.putpixel((x, y), new_color) 

    im.save(path+"__out.png") 

它的https://stackoverflow.com/a/6483549/541208