我想用Python更改單一顏色。用另一種顏色更改所有像素的顏色
如果有PIL的快速解決方案存在,我寧願這個解決方案。
目前,我用
convert -background black -opaque '#939393' MyImage.png MyImage.png
我想用Python更改單一顏色。用另一種顏色更改所有像素的顏色
如果有PIL的快速解決方案存在,我寧願這個解決方案。
目前,我用
convert -background black -opaque '#939393' MyImage.png MyImage.png
如果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帶單獨出現,而更簡單的版本則不會。
我剛剛想出了這個解決方案:
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並不快,這似乎是足夠快的我。
這是對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')
我花了很長時間才弄清楚如何使它工作。我希望它能幫助別人。
該解決方案使用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")
的修改可能不會有所作爲速度明智的,但你可以做'PIX [X,Y] = mycolor2'而不是使用'im.putpixel()'。 – zeekay
我試過這個,但由於打開圖像的模式('r'),我得到一個錯誤。我試過'Image.open(「MyImage.png」,「w」)',但它不起作用。我不知道如何使用'pix [x,y] = mycolor2' –
不知道爲什麼它不起作用,也許是一個錯誤? – zeekay