我在做一个项目时刚刚遇到了 pythons PIL 库,所以对此很陌生。
我的简单程序从目录中导入一张图像,使用 PIL 应用所需的操作,然后将其保存到不同的文件夹中。
我的问题 - 我可以批量导入包含多个图像的目录并在 PIL 中对该目录中的所有图像运行所需的操作吗?
答案 0 :(得分:2)
一般来说,在处理通常对内存要求很高的图像时,将数千张图像批量加载到内存中,然后处理它们,然后将它们全部写出来并不是最好的主意,因为您对它们产生了巨大的需求您计算机的 RAM 可能会减慢速度。这导致代码更像这样:
#!/usr/bin/env python3
import glob
from PIL import Image
def ProcessOne(f):
print(f'Opening {f}')
im = Image.open(f)
... process ...
... process ...
if __name__ == '__main__':
# Create a list of files to process
files = [f for f in glob.glob("*.jpg")]
for f in files:
ProcessOne(f)
此外,如果您对大量图像进行相同的处理,那么使用 Python 的 multiprocessing
模块通常是一个合理的想法,因为就其本身而言,Python 不会使用所有那些可爱的 CPU 内核你为英特尔支付了如此丰厚的费用,这是一个严肃的考虑,因为 CPU 继续变得更胖(更多内核)而不是更高(更多 GHz)。这导致代码更像这个例子,几乎没有更难编写或阅读:
#!/usr/bin/env python3
import glob
from multiprocessing import Pool
from PIL import Image
def ProcessOne(f):
im = Image.open(f)
... process ...
if __name__ == '__main__':
# Create a pool of processes to check files
p = Pool()
# Create a list of files to process
files = [f for f in glob.glob("*.jpg")]
print(f'Files to process: {len(files)}')
# Map the list of files to check onto the Pool
p.map(ProcessOne, files)
另请注意,您可以使用 ImageMagick 来简单地处理数百个文件并将结果写入不同的目录。因此,假设您想标准化一个充满 JPEG 的整个目录的亮度级别,并将修改后的文件写入名为 OUTPUT
的目录中,您可以在终端中执行此操作:
mkdir -p OUTPUT
magick mogrify -path OUTPUT -auto-level *.jpg