2012-07-14 71 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代码。