-->

的Python:用透明背景反转图像(PIL,瘸子,...)(Python: invert image

2019-09-19 11:39发布

我有一组上透明背景的白色图标,我想反转他们全部是黑色的透明背景。

试图与PIL(ImageChops),但它似乎并不具有透明背景的工作。 我也尝试GIMP的Python接口,但没有运气,无论是。

任何想法如何反向最好在Python实现?

Answer 1:

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


Answer 2:

我曾尝试橡果的做法,但结果却是有些奇怪(下面的图像的顶部)。

底部的图标是我真正想要的,我用它来实现难懂的的转换方法:

convert tools.png -negate tools_black.png

(本身并不Python,但Python包装存在,像PythonMagickWand 。

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



Answer 3:

你可以做到这一点很容易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')

试一试。



Answer 4:

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代码。



文章来源: Python: invert image with transparent background (PIL, Gimp,…)