2012-07-14 13 views
5

Mam zestaw białych ikon na przezroczystym tle i chciałbym je wszystkie odwrócić na czarno na przezroczystym tle.Python: obraz odwrócony z przezroczystym tłem (PIL, Gimp, ...)

enter image description here

Próbowałem z PIL (ImageChops), ale nie wydaje się, aby pracować z przezroczystym tłem. Próbowałem także interfejsu Pythona Gimpa, ale też nie miałem szczęścia.

Czy wiesz jak najlepiej odwracać w Pythonie?

+0

Jaki format mają obrazy? – Acorn

+0

ich format pliku to png – Hoff

Odpowiedz

5

ImageChops.invert wydaje się również odwracać kanał alfa każdego piksela.

To powinno załatwić sprawę:

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') 
+0

Zamiast definiować własne 'invert()' możesz po prostu użyć 'ImageOps.invert()' na każdym kanale, ponieważ każdy kanał ma typ '" L "'. (lub przypuszczam 'ImageChops.invert()', ale nigdy tego nie testowałem). – Ray

1

Próbowałem podejście żołądź, ale wynik jest nieco dziwne (górna część poniższy obrazek).

enter image description here

Dno ikona jest to, co naprawdę chciałem, osiągnąłem go za pomocą Image Magick „s konwersji metoda:

convert tools.png -negate tools_black.png

(nie pyton per se, ale istnieje owijarki python, jak PythonMagickWand.JPG

Jedyną wadą jest to, że trzeba zainstalować kilka zależności, aby uruchomić ImageMagick, ale wydaje się, że jest to potężny obraz struktura ramowa.

+0

Tak, kod, który napisałem, konwertował tylko białe piksele na czerń. Zaktualizowałem swoją odpowiedź, używając ogólnej inwersji. – Acorn

0

Można to zrobić dość łatwo PIL, tak:

  1. Upewnij się, że obraz jest reprezentowany jako RGBA, używając convert('RGBA').
  2. Podziel obraz na oddzielne pasma RGBA.
  3. Zrób co chcesz z pasmami RGB (w twoim przypadku ustawimy je wszystkie na czarno, używając funkcji point), ale nie dotykaj pasma alfa.
  4. Scal wstęgi z powrotem.

herezje kod:

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') 

dać mu szansę.

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') 

Jak dotąd najszybsze rozwiązanie, ponieważ nie interpretuje żadnego kodu Pythona wewnątrz pętli "dla każdego piksela".

Powiązane problemy