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

7
我有一组带透明背景的白色图标,我想将它们全部反转为带透明背景的黑色图标。
我尝试过PIL(ImageChops),但似乎无法处理透明背景。我还尝试了Gimp的Python接口,但也没有成功。
您有什么想法如何在Python中实现反转呢?

他们的文件格式是png。 - Hoff
4个回答

8

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')

不必定义自己的 invert(),因为每个通道都具有类型 "L",所以您可以在每个通道上使用 ImageOps.invert()。 (或者我想也可以使用 ImageChops.invert(),但我从未亲自测试过)。 - Ray

1

我尝试了Acorn的方法,但结果有些奇怪(如下图的顶部部分)。

enter image description here

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

convert tools.png -negate tools_black.png

(虽然不是Python本身,但有Python包装器,如PythonMagickWand

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


没错,我发布的代码只是将白色像素转换为黑色。我已经更新了我的答案,加入了通用的反转功能。 - Acorn

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')

可能是迄今为止最快的解决方案,因为它不会在“对每个像素”循环中解释任何Python代码。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接