我有一套透明背景上的白色图标,我想将它们全部反转为透明背景上的黑色。Python:反转图像透明背景(PIL,Gimp,...)
试图与PIL(ImageChops),但它似乎并不具有透明背景的工作。我也尝试过Gimp的Python界面,但没有运气。
任何想法如何颠倒最好在Python中实现?
我有一套透明背景上的白色图标,我想将它们全部反转为透明背景上的黑色。Python:反转图像透明背景(PIL,Gimp,...)
试图与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')
由于每个通道的类型都是“L”,所以不必定义自己的'invert()',而是在每个通道上使用'ImageOps.invert()'。 (或者我认为'ImageChops.invert()',但我从来没有测试过自己)。 – Ray 2016-06-03 16:28:23
我已经试过橡果的做法,但结果却是有些奇怪(下面的图像的顶部)。
底部的图标是我真正想要的,我用Image Magick“实现IT方面转换方法:
convert tools.png -negate tools_black.png
(而不是Python本身,而是Python包装的存在,像PythonMagickWand。
唯一的缺点是你必须安装一堆依赖才能让ImageMagick工作,但它似乎是一个强大的图像管理系统调整框架。
对,我发布的代码只是将白色像素转换为黑色。我用一个通用的反演更新了我的答案。 – Acorn 2012-07-15 07:55:31
你可以用PIL
做到这一点很容易,就像这样:
RGBA
,通过使用convert('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代码。
图像格式是什么? – Acorn 2012-07-14 13:42:52
他们的文件格式是png – Hoff 2012-07-14 13:43:46