2012-07-14 100 views
5

我有一套透明背景上的白色圖標,我想將它們全部反轉爲透明背景上的黑色。Python:反轉圖像透明背景(PIL,Gimp,...)

enter image description here

試圖與PIL(ImageChops),但它似乎並不具有透明背景的工作。我也嘗試過Gimp的Python界面,但沒有運氣。

任何想法如何顛倒最好在Python中實現?

+0

圖像格式是什麼? – Acorn 2012-07-14 13:42:52

+0

他們的文件格式是png – Hoff 2012-07-14 13:43:46

回答

5

ImageChops.invert似乎也反轉每個像素的alpha通道。

這應該做的工作:

import Image 

img = Image.open('image.png').convert('RGBA') 

r, g, b, a = img.split() 

def invert(image): 
    return image.point(lambda p: 255 - p) 

r, g, b = map(invert, (r, g, b)) 

img2 = Image.merge(img.mode, (r, g, b, a)) 

img2.save('image2.png') 
+0

由於每個通道的類型都是「L」,所以不必定義自己的'invert()',而是在每個通道上使用'ImageOps.invert()'。 (或者我認爲'ImageChops.invert()',但我從來沒有測試過自己)。 – Ray 2016-06-03 16:28:23

1

我已經試過橡果的做法,但結果卻是有些奇怪(下面的圖像的頂部)。

enter image description here

底部的圖標是我真正想要的,我用Image Magick「實現IT方面轉換方法:

convert tools.png -negate tools_black.png

(而不是Python本身,而是Python包裝的存在,像PythonMagickWand

唯一的缺點是你必須安裝一堆依賴才能讓ImageMagick工作,但它似乎是一個強大的圖像管理系統調整框架。

+0

對,我發佈的代碼只是將白色像素轉換爲黑色。我用一個通用的反演更新了我的答案。 – Acorn 2012-07-15 07:55:31

0

你可以用PIL做到這一點很容易,就像這樣:

  1. 確保圖像被表示爲RGBA,通過使用convert('RGBA')
  2. 將圖像拆分爲單獨的RGBA條帶。
  3. 做什麼你想要的RGB樂隊(在你的情況下,我們通過使用point函數全部設置爲黑色),但不要觸摸alpha樂隊。
  4. 將樂隊合併回去。

繼承人的代碼:

import Image 
im = Image.open('image.png') 
im = im.convert('RGBA') 
r, g, b, a = im.split() 
r = g = b = r.point(lambda i: 0) 
im = Image.merge('RGBA', (r, g, b, a)) 
im.save('saved.png') 

給它一個鏡頭。

0
import Image, numpy 
pixels = numpy.array(Image.open('myimage.png')) 
pixels[:,:,0:3] = 255 - pixels[:,:,0:3] # invert 
Image.fromarray(pixels).save('out.png') 

可能是迄今爲止最快的解決方案,因爲它不解釋「for each pixel」循環中的任何Python代碼。