使用Python逐个打开文件夹中的图像?

10

大家好,我需要逐一打开文件夹中的图像,对它们进行处理,并将它们保存回另一个文件夹。我正在使用以下示例代码完成此操作。

path1 = path of folder of images    
path2 = path of folder to save images    

listing = os.listdir(path1)    
for file in listing:
    im = Image.open(path1 + file)    
    im.resize((50,50))                % need to do some more processing here             
    im.save(path2 + file, "JPEG")

有没有最好的方法来做这件事?

谢谢!


1
看起来一个接一个地处理似乎没问题,避免了对内存的负载。 - Siva Cn
4
提醒一下,Python的注释符号是#,不是%(LaTeX程序员用的),这样或许可以避免你以后遇到一些麻烦。 :) - Christian Ternus
1
你实际上想要做什么?请在你的问题中加入更多描述——通过尽可能完整地提出问题,帮助我们帮助你。 - Christian Ternus
如果您希望它不是阻塞调用,我建议为每个图像处理创建一个“线程”。 - jramirez
@ChristianTernus:如我上面所提到的,我需要从一个文件夹中打开图像,并通过一些处理将它们保存在另一个文件夹中。目前我是逐个打开图像,进行处理,然后将其保存到另一个文件夹中。我的问题是是否可以一次性为所有图像完成而不是逐个打开它们? - user2766019
2个回答

13

看起来你想要使用多线程。这里是一个可以实现这个功能的快速修订版。

from multiprocessing import Pool
import os

path1 = "some/path"
path2 = "some/other/path"

listing = os.listdir(path1)    

p = Pool(5) # process 5 images simultaneously

def process_fpath(path):
    im = Image.open(path1 + path)    
    im.resize((50,50))                # need to do some more processing here             
    im.save(os.path.join(path2,path), "JPEG")

p.map(process_fpath, listing)

(编辑: 使用multiprocessing代替Thread, 请查看该文档获取更多示例和信息)


2
您可以使用glob来逐个读取图片。
import glob
from PIL import Image


images=glob.glob("*.jpg")
for image in images:
    img = Image.open(image)
    img1 = img.resize(50,50)
    img1.save("newfolder\\"+image)    

1
这很好,但正确的语法是img.resize((50,50)),其中(50,50)是一个元组。否则第二个50会被解释为resample参数,你会得到PIL: ValueError: unknown resampling filter - Casey L

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接