Как инвертировать цвета изображения с помощью PIL (Python-Imaging)? - PullRequest
42 голосов
/ 23 марта 2010

Мне нужно преобразовать серию изображений, нарисованных белыми на черном фоне, в изображения, где белый и черный инвертированы (как негатив).Как я могу добиться этого с помощью PIL?

Ответы [ 5 ]

63 голосов
/ 23 марта 2010

Попробуйте следующее из документов: 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')

Примечание: «Модуль ImageOps содержит несколько« готовых »операций обработки изображений. Этот модуль несколько экспериментален, и большинство операторов работают только с изображениями L и RGB.»

25 голосов
/ 14 октября 2012

Если изображение прозрачно по 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')
16 голосов
/ 14 июля 2016

Для тех, кто работает с изображением в режиме «1» (т. Е. 1-битные пиксели, черно-белые, хранятся с одним пикселем на байт - см. Документы ), вам необходимо преобразовать его в Режим «L» перед вызовом PIL.ImageOps.invert.

Таким образом:

im = im.convert('L')
im = ImageOps.invert(im)
im = im.convert('1')
0 голосов
/ 09 июля 2018
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()

`

0 голосов
/ 08 июня 2018

В случае, если кто-то инвертирует изображение CMYK, текущие реализации PIL и Pillow, похоже, не поддерживают это и выдают ошибку.Однако вы можете легко обойти эту проблему, инвертировав отдельные полосы вашего изображения, используя эту удобную функцию (по сути, расширение поста Грега Садецкого выше):

...