2012-04-30 165 views
0

我在按照RGB值的順序對圖像的像素進行排序。作爲新的Python的我想這:用Python和PIL緩慢處理圖像

from PIL import Image 

source = Image.open("source.jpg") 
colors = source.getcolors(source.size[0] * source.size[1]) #maxcolor value =256, get all colors with source.size[0] * source.size[1] 
pixels = [] 
for i, color in colors: 
    pixels.extend(i * [color]) 
    pixels.sort() 
    new = Image.new('RGB', source.size) 
    new.putdata(pixels) 
    new.save("new.png") 

它的工作原理以及安靜的周圍40×40像素的小文件。但目標是在高達3000x2000分辨率的照片上使用它,我試着運行它,但兩個小時後仍然沒有結束。代碼能夠優化嗎,我做了一些完全錯誤的事情還是Python不適合這種類型的任務?

回答

5

Python中的縮進是關鍵,否則您可以運行代碼,而不是每次迭代。

在這裏,您每次循環時都會保存文件,因爲圖像生成是縮進的。相反,嘗試:

from PIL import Image 

source = Image.open("source.jpg") 
colors = source.getcolors(source.size[0] * source.size[1]) #maxcolor value =256, get all colors with source.size[0] * source.size[1] 
pixels = [] 
for i, color in colors: 
    pixels.extend(i * [color]) 
pixels.sort() 
new = Image.new('RGB', source.size) 
new.putdata(pixels) 
new.save("new.png") 
1

getcolors找回列表可以直接排序,那麼所有你需要做的就是從它重建的圖像。

colors = source.getcolors(source.size[0] * source.size[1]) 
colors.sort(key=lambda pair: pair[1]) 

而且,Boud mentioned,注重循環內什麼。

+0

我也試過這個,但有重建圖像沒有工作的問題。我試過:new.putdata(顏色),但是這返回一個TypeError。 – dan

+0

@dan,您已經有了從顏色列表中正確構建圖像的代碼,這就是爲什麼我沒有將它包含在答案中的原因。你只需要移除'sort'。 –