5

Mam duży katalog zrzutów ekranu. Głupio mi, że nie sprawdziłem, czy wszystko wychodzi dobrze i odkryłem, że VLC ma błąd w FRAPS True RGB. Na szczęście wydaje się, że można go naprawić, wygląda na to, że jedynym problemem jest zamiana kanałów R i B.Zamień wartości kanałów kolorów R i B w katalogu obrazów? Python

Używanie PIL Pythona Chciałbym pobrać wartości koloru czerwonego i niebieskiego dla każdego piksela dla każdego obrazu, a następnie wstawić je ponownie zamienione.

Wiem, jak przejść przez katalog, więc głównym elementem, którego mi brakuje, jest najlepszy sposób zamiany wartości. Myślę, że mógłbym zrobić to pikselowo na piksel, ale może jest bardziej pytonowo, być może wsadowy to wszystko w jednym poleceniu?

Dowolny przykładowy kod lub łącza byłyby wysoko cenione!

Odpowiedz

1
import os 
from PIL import Image 


dirPath = r"D:\Fraps\Movies\Screens" 
dirList = os.listdir(dirPath) 
outPath = r"D:\Fraps\Movies\Screens\Output" 

for (dirname, dirs, files) in os.walk(dirPath): 
    for filename in files: 
     if filename.endswith('.png'): 
      print("Opening:"+filename) 
      thefile = os.path.join(dirname,filename) 
      im = Image.open(thefile) 
      #im.load() 

      width, height = im.size 

      im_rgb = im.convert('RGB') 

      for x in range(0, width): 
       for y in range(0,height): 
        r, g, b = im_rgb.getpixel((x, y)) 
        im_rgb.putpixel((x, y), (b, g, r)) 

      print("Saving:"+filename) 
      #outfile, ext = os.path.splitext(infile) 
      outfile = os.path.join(outPath,filename) 
      im_rgb.save(outfile, "PNG") 


print("Ding!") 
1

Możesz pozwolić firmie ImageMagick zrobić to za Ciebie. Zróbmy czerwono-czarny gradient obrazu tak:

convert -size 256x100 gradient:red-black in.png 

enter image description here

Teraz możemy załadować go oddzielić R, G i kanały B, zamienić czerwony z niebieskim i rekombinacji je do wyjście obrazu:

convert in.png -separate -swap 0,2 -combine out.png 

enter image description here

ImageMagick jest zainstalowany na większości dystrybucji Linuksa i dostępne dla OSX (najlepiej poprzez homebrew), a także dla systemu Windows od here.

Jeśli chcesz zrobić cały katalog PNG plików, na przykład, byś

find . -iname "*.png" -exec convert "{}" -separate -swap 0,2 -combine {} \; 

jeśli jesteś na Linux lub OS X.

Jeśli jesteś na Windows, byś trzeba zrobić coś takiego z szalonego składni systemu Windows:

FOR %%F in (*.PNG) DO convert "%%F" -separate -swap 0,2 -combine "%%F 
+0

o, to jest śliskie, skończyło się na tym, że to zrobiłem, ale chciałbym się o tym dowiedzieć. Jak na przykład użyć tego dla całego katalogu? Czy mogę użyć katalogu jako pliku danych i dodać opcję -r? – veta

+0

Proszę spojrzeć jeszcze raz - zaktualizowałem swoją odpowiedź. –

+1

Uwaga, istnieją również powiązania Python dla ImageMagick, zobacz: http://www.imagemagick.org/script/api.php –

2

Opierając się na odpowiedź @ Veta, proces może być znacznie przyspieszone przez pracę na kanałach kolorów zamiast individ UAL pikseli:

W pętli dla każdego pliku, kanały mogą zostać zamienione tak:

r, g, b = im_rgb.split() 
im_rgb = Image.merge('RGB', (b, g, r)) 

Wystarczy użyć tych dwóch wierszy zamiast zagnieżdżonych pętli w odpowiedzi na Veta. To powinno działać znacznie szybciej.

To rozwiązanie najpierw używa Image.split(), aby utworzyć trzy osobne obrazy, po jednym dla każdego kanału R, G, B. Następnie Image.merge() służy do tworzenia nowego obrazu RGB z zamienionymi kanałami R i B.