Python:用透明背景反转图像(PIL,Gimp,...)

时间:2012-07-14 13:35:45

标签: python transparency python-imaging-library gimp

我在透明背景上有一组白色图标,我想将它们全部反转为透明背景上的黑色。

enter image description here

尝试使用PIL(ImageChops),但它似乎不适用于透明背景。我也尝试过Gimp的Python界面,但也没有运气。

知道如何在Python中最好地实现反转吗?

4 个答案:

答案 0 :(得分: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')

答案 1 :(得分:1)

我尝试过Acorn的方法,但结果有些奇怪(下图中的上半部分)。

enter image description here

底部图标是我真正想要的,我使用Image Magick的转换方法实现了它:

convert tools.png -negate tools_black.png

(不是python本身,但存在python包装器,如PythonMagickWand

唯一的缺点是你必须安装一堆依赖项才能让ImageMagick工作,但它似乎是一个强大的图像处理框架。

答案 2 :(得分:0)

您可以使用PIL轻松完成此操作,如下所示:

  1. 使用RGBA确保图像显示为convert('RGBA')
  2. 将图像拆分为单独的RGBA个频段。
  3. RGB频段执行任何操作(在您的情况下,我们使用point函数将它们全部设置为黑色),但不要触摸Alpha频段。
  4. 合并乐队。
  5. 继承人代码:

    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')
    
    试一试。

答案 3 :(得分: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代码。