5

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

在此处输入图像描述

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

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

4

4 回答 4

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')
于 2012-07-14T14:27:52.537 回答
1

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

在此处输入图像描述

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

convert tools.png -negate tools_black.png

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

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

于 2012-07-14T15:33:34.870 回答
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')

试一试。

于 2012-07-14T19:27:06.390 回答
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 代码。

于 2012-07-15T11:29:59.297 回答