代码之家  ›  专栏  ›  技术社区  ›  bialix

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

  •  40
  • bialix  · 技术社区  · 14 年前

    我需要转换为一系列的图像绘制为白色的黑色背景字母的图像,其中白色和黑色是反向的(作为负片)。如何使用PIL实现这一点?

    5 回复  |  直到 14 年前
        1
  •  98
  •   Jonathan Root Josep Valls    11 年前

    从文档中尝试以下操作: http://effbot.org/imagingbook/imageops.htm

    from PIL import Image
    import PIL.ImageOps    
    
    image = Image.open('your_image.png')
    
    inverted_image = PIL.ImageOps.invert(image)
    
    inverted_image.save('new_name.png')
    

        2
  •  33
  •   Dave    12 年前

    如果图像是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')
    
        3
  •  27
  •   Greg Sadetsky    8 年前

    对于在“1”模式下处理图像的任何人(即1位像素,黑白,每字节存储一个像素)-- see docs PIL.ImageOps.invert

    因此:

    im = im.convert('L')
    im = ImageOps.invert(im)
    im = im.convert('1')
    
        4
  •  -1
  •   mxl    6 年前

    以防有人把 CMYK 如图所示,当前的PIL和Pillow实现似乎不支持这一点,并抛出了一个错误。然而,您可以通过使用这个方便的函数(基本上是Greg Sadetsky上面文章的扩展)反转图像的各个波段,轻松地绕过这个问题:

    def CMYKInvert(img) :
        return Image.merge(img.mode, [ImageOps.invert(b.convert('L')) for b in img.split()])
    
        5
  •  -2
  •   zilgo    6 年前
    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()