2012-04-30 106 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'。 –