我有一套透明背景上的白色圖標,我想將它們全部反轉爲透明背景上的黑色。Python:反轉圖像透明背景(PIL,Gimp,...)
試圖與PIL(ImageChops),但它似乎並不具有透明背景的工作。我也嘗試過Gimp的Python界面,但沒有運氣。
任何想法如何顛倒最好在Python中實現?
我有一套透明背景上的白色圖標,我想將它們全部反轉爲透明背景上的黑色。Python:反轉圖像透明背景(PIL,Gimp,...)
試圖與PIL(ImageChops),但它似乎並不具有透明背景的工作。我也嘗試過Gimp的Python界面,但沒有運氣。
任何想法如何顛倒最好在Python中實現?
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')
由於每個通道的類型都是「L」,所以不必定義自己的'invert()',而是在每個通道上使用'ImageOps.invert()'。 (或者我認爲'ImageChops.invert()',但我從來沒有測試過自己)。 – Ray 2016-06-03 16:28:23
我已經試過橡果的做法,但結果卻是有些奇怪(下面的圖像的頂部)。
底部的圖標是我真正想要的,我用Image Magick「實現IT方面轉換方法:
convert tools.png -negate tools_black.png
(而不是Python本身,而是Python包裝的存在,像PythonMagickWand。
唯一的缺點是你必須安裝一堆依賴才能讓ImageMagick工作,但它似乎是一個強大的圖像管理系統調整框架。
對,我發佈的代碼只是將白色像素轉換爲黑色。我用一個通用的反演更新了我的答案。 – Acorn 2012-07-15 07:55:31
你可以用PIL
做到這一點很容易,就像這樣:
RGBA
,通過使用convert('RGBA')
。RGBA
條帶。RGB
樂隊(在你的情況下,我們通過使用point
函數全部設置爲黑色),但不要觸摸alpha樂隊。繼承人的代碼:
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')
給它一個鏡頭。
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代碼。
圖像格式是什麼? – Acorn 2012-07-14 13:42:52
他們的文件格式是png – Hoff 2012-07-14 13:43:46