Python:使用透明背景反转图像(PIL、Gimp等)

Python:使用透明背景反转图像(PIL、Gimp等),python,transparency,python-imaging-library,gimp,Python,Transparency,Python Imaging Library,Gimp,我在透明背景上有一组白色图标,我想将它们全部反转为透明背景上的黑色 我已经尝试过使用PIL(ImageChops),但它似乎不适用于透明背景。我也尝试过Gimp的Python接口,但也没有成功 知道Python中如何最好地实现反转吗?ImageChops.invert似乎也反转每个像素的alpha通道 这应该可以做到: import Image img = Image.open('image.png').convert('RGBA') r, g, b, a = img.split() d

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

我已经尝试过使用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')

我尝试过Acorn的方法,但结果有点奇怪(下图顶部)

底部图标是我真正想要的,我通过使用的convert方法实现了它:

convert tools.png-否定工具\u black.png

(不是python本身,而是python包装器的存在,如


唯一的缺点是,您必须安装一系列依赖项才能使ImageMagick正常工作,但它似乎是一个强大的图像处理框架。

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

  • 使用
    convert('RGBA')
    确保图像显示为
    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代码。

    他们的文件格式是pngRight,我发布的代码只是将白色像素转换为黑色。我用一个通用的反转更新了我的答案。而不是定义自己的
    invert()
    您可以在每个通道上使用
    ImageOps.invert()
    ,因为每个通道都有
    类型“L”
    (或者我想
    ImageChops.invert()
    ,但我自己从未测试过)。