2015-07-02 13 views
5

Ich habe ein großes Verzeichnis von Screenshots. Dumm ich, ich habe nicht überprüft, dass sie gut ausgehen und herausgefunden, wie hart VLC einen Fehler mit FRAPS True RGB hat. Zum Glück scheint es reparierbar, es sieht so aus, als ob das einzige Problem ist, dass die R- und B-Kanäle ausgetauscht wurden.Tauschen Sie R- und B-Farbkanalwerte in einem Verzeichnis von Bildern aus? Python

Mit Python PIL Ich möchte die roten und blauen Werte für jedes Bild für jedes Pixel packen und sie dann getauscht wieder einsetzen.

Ich weiß, wie durch ein Verzeichnis zu gehen, um das Hauptstück, die Werte zu tauschen fehlt mir der beste Weg ist. Ich denke, ich könnte es Pixel für Pixel tun, aber vielleicht gibt es einen mehr pythischen Weg, vielleicht alles in einem Befehl zu mischen?

All Beispiel-Code oder Links wäre sehr geschätzt!

Antwort

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

Sie können ImageMagick das für Sie tun lassen. Lassen Sie uns einen rot-schwarzen Farbverlauf Bild wie folgt machen:

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

enter image description here

Jetzt können wir es laden, trennen Sie die R-, G- und B-Kanäle, tauschen Sie das Rot mit dem Blauen und rekombinieren sie in die Ausgabebild:

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

enter image description here

ImageMagick auf den meisten Linux-Distributionen und für OSX (idealerweise überinstalliert ist) und auch für Windows von here.

Wenn Sie ein ganzes Verzeichnis von PNG Dateien tun wollen, zum Beispiel, würden Sie tun

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

, wenn Sie unter Linux oder OS X sind

Wenn Sie unter Windows sind, würden Sie braucht so etwas wie dies mit der verrückten Windows-Syntax zu tun:

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

oh das ist glatt, landete ich Python bekommen, es zu tun, aber ich möchte mehr darüber wissen. Wie würde ich das zum Beispiel für ein ganzes Verzeichnis verwenden? Kann ich ein Verzeichnis als Infile verwenden und ein -r Flag hinzufügen? – veta

+0

Bitte schauen Sie noch einmal - ich habe meine Antwort aktualisiert. –

+1

Hinweis und es gibt Python-Bindings für ImageMagick finden Sie unter: http://www.imagemagick.org/script/api.php –

2

aufbauend auf @ veta Antwort, der Prozess stark durch die Arbeit an Farbkanälen statt indivi beschleunigt werden kann, UAL Pixel:

für jede Datei in der Schleife, wie diese Kanäle ausgetauscht werden können: anstelle der verschachtelten Schleifen in veta Antwort

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

gerade diese zwei Leitungen verwenden. Dies sollte deutlich schneller laufen.

Diese Lösung verwendet zuerst Image.split() drei separate Bilder zu erzeugen, eine für jede R, G, B, Kanal. Dann wird Image.merge() verwendet, um ein neues RGB-Bild mit vertauschten R- und B-Kanälen zu erstellen.