2015-07-02 55 views
5

我有一個大的截圖目錄。愚蠢的我沒有檢查他們是否很好,並發現VLC有一個FRAPS True RGB的問題。幸運的是它似乎是可以修復的,看起來唯一的問題是R和B通道被交換。在圖像目錄中交換R和B顏色通道值? Python

使用Python的PIL我想抓住每個圖像的每個像素的紅色和藍色值,然後重新插入它們交換。

我知道如何瀏覽目錄,因此我缺少的主要部分是交換值的最佳方式。我認爲我可以爲像素做像素,但也許有一種更爲pythonic的方式,也許用一個命令來批量處理?

任何示例代碼或鏈接將不勝感激!

回答

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

您可以讓ImageMagick爲您做到這一點。讓我們這樣的紅黑漸變的圖像:

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

enter image description here

現在,我們可以加載它,用藍色分離R,G和B通道,交換紅色和它們重新組合成輸出圖像:

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

enter image description here

被安裝在大多數Linux發行版,可供OSX(理想的ImageMagick通過homebrew)以及用於Windows的here

如果你想要做的PNG文件的整個目錄,例如,你會做

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

,如果你是在Linux或OS X.

如果您使用的是Windows,你會需要使用瘋狂的Windows語法做這樣的事情:

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

哦,那是華而不實的,我最終得到蟒蛇做,但我想更多地瞭解這一點。例如,我將如何將它用於整個目錄?我可以使用目錄作爲INFILE並添加-r標誌? – veta

+0

請再看一下 - 我已經更新了我的答案。 –

+1

注以及有Python綁定ImageMagick的,請參閱:http://www.imagemagick.org/script/api。php –

2

在@ veta的答案上構建,通過處理顏色通道而不是個別通道UAL像素:

在迴路的每個文件,通道可以交換這樣的:

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

中女傑的答案只需使用這兩條線來代替嵌套循環。這應該運行得更快。

該解決方案首先使用Image.split()創建三個單獨的圖像,每個R,G,B通道一個。然後使用Image.merge()創建一個具有交換的R和B通道的新RGB圖像。