【问题标题】:Python: invert image with transparent background (PIL, Gimp,...)Python:反转具有透明背景的图像(PIL,Gimp,...)
【发布时间】:2012-07-14 13:35:44
【问题描述】:

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

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

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

【问题讨论】:

  • 他们的文件格式是png

标签: python transparency python-imaging-library gimp


【解决方案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')

【讨论】:

  • 您可以只在每个频道上使用ImageOps.invert(),而不是定义自己的invert(),因为每个频道都有"L" 类型。 (或者我想ImageChops.invert() 但我自己从未测试过)。
【解决方案2】:

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

底部图标是我真正想要的,我通过Image Magick的convert方法实现的:

convert tools.png -negate tools_black.png

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

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

【讨论】:

  • 对,我发布的代码只是将白色像素转换为黑色。我已经用通用倒置更新了我的答案。
【解决方案3】:

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

  1. 使用convert('RGBA') 确保图像以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')

试一试。

【讨论】:

    【解决方案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')
    

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-12-05
      • 2017-04-18
      • 2012-05-26
      • 2019-02-08
      • 2015-05-15
      • 2014-02-27
      • 1970-01-01
      相关资源
      最近更新 更多