如何使用PIL(Python图像处理)反转图像的颜色?

如何使用PIL(Python图像处理)反转图像的颜色?,python,python-imaging-library,Python,Python Imaging Library,我需要将一系列在黑色背景字母上绘制为白色的图像转换为黑白颠倒的图像(作为负片)。如何使用PIL实现这一点?从文档中尝试以下内容: 注意:“ImageOps模块包含许多‘现成’的图像处理操作。此模块在某种程度上是实验性的,大多数操作员只处理L和RGB图像。”如果图像是RGBA透明的,则此操作将失败。。。不过,这应该是可行的: from PIL import Image import PIL.ImageOps image = Image.open('your_image.png') if

我需要将一系列在黑色背景字母上绘制为白色的图像转换为黑白颠倒的图像(作为负片)。如何使用PIL实现这一点?

从文档中尝试以下内容:


注意:“ImageOps模块包含许多‘现成’的图像处理操作。此模块在某种程度上是实验性的,大多数操作员只处理L和RGB图像。”

如果图像是RGBA透明的,则此操作将失败。。。不过,这应该是可行的:

from PIL import Image
import PIL.ImageOps    

image = Image.open('your_image.png')
if image.mode == 'RGBA':
    r,g,b,a = image.split()
    rgb_image = Image.merge('RGB', (r,g,b))

    inverted_image = PIL.ImageOps.invert(rgb_image)

    r2,g2,b2 = inverted_image.split()

    final_transparent_image = Image.merge('RGBA', (r2,g2,b2,a))

    final_transparent_image.save('new_file.png')

else:
    inverted_image = PIL.ImageOps.invert(image)
    inverted_image.save('new_name.png')

对于在“1”模式下处理图像的任何人(即,以每字节一个像素的形式存储的1位黑白像素),在调用
PIL.ImageOps.invert
之前,需要将其转换为“L”模式

因此:


如果有人正在反转一个
CMYK
图像,当前的PIL和Pillow实现似乎不支持这一点,并抛出一个错误。但是,您可以通过使用此方便的功能(本质上是上面Greg Sadetsky文章的扩展)反转图像的各个波段,轻松绕过此问题:


`

哦,我好像错过了那个模块。谢谢。是的,但是一些PIL实现在非
RGB
L
模式的图像上会失败(即
RGBA
CMYK
1
),在这种情况下,您必须使用变通方法将源图像的波段转换为L图像,然后反转这些波段,然后将它们合并在一起(见下文).模块“PIL”没有属性“ImageOps”,但这不包括用于反转的alpha通道。如果我还想反转alpha通道呢?这是一个如此古老的答案,仍然像一个符咒一样工作。谢谢你,伙计!我希望有一种方法可以告诉你其他的方法,比如使用遮罩来反转,而不是这种解决方法。。。但是,哦,好吧,它现在起作用了!
from PIL import Image
import PIL.ImageOps    

image = Image.open('your_image.png')
if image.mode == 'RGBA':
    r,g,b,a = image.split()
    rgb_image = Image.merge('RGB', (r,g,b))

    inverted_image = PIL.ImageOps.invert(rgb_image)

    r2,g2,b2 = inverted_image.split()

    final_transparent_image = Image.merge('RGBA', (r2,g2,b2,a))

    final_transparent_image.save('new_file.png')

else:
    inverted_image = PIL.ImageOps.invert(image)
    inverted_image.save('new_name.png')
im = im.convert('L')
im = ImageOps.invert(im)
im = im.convert('1')
def CMYKInvert(img) :
    return Image.merge(img.mode, [ImageOps.invert(b.convert('L')) for b in img.split()])
from PIL import Image

img = Image.open("archive.extension") 

pixels = img.load()

for i in range(img.size[0]):
    for j in range(img.size[1]):
        x,y,z = pixels[i,j][0],pixels[i,j][1],pixels[i,j][2]
        x,y,z = abs(x-255), abs(y-255), abs(z-255)
        pixels[i,j] = (x,y,z)

img.show()