У меня есть каталог, который структурирован следующим образом:
├── directory
| ├── sub-directory_1
| | ├── img1.jpg
| | └── img2.jpg
| |
| ├── sub-directory_2
| | ├── img1.jpg
| | └── img2.jpg
. .
. .
. .
.
| └── sub-directory_n
| | ├── img1.jpg
| | └── img2.jpg
У меня есть этот код, который изменяет размеры всех изображений в каталоге:
from PIL import Image
import os, sys
path = "/directory"
dirs = os.listdir( path )
def resize():
for item in dirs:
if os.path.isfile(path+item):
im = Image.open(path+item)
f, e = os.path.splitext(path+item)
imResize = im.resize((64,64), Image.ANTIALIAS)
imResize.save(f + 'r.jpg', 'JPEG', quality=90)
resize()
Есть ли способ изменить его, чтобы он итеративно изменял размеры всех изображений в подкаталогах?
Соответствует ли это счету?
from PIL import Image
import os, sys
dir_path = "/directory"
def resize_im(path):
if os.path.isfile(path):
im = Image.open(path).resize((64,64), Image.ANTIALIAS)
parent_dir = os.path.dirname(path)
img_name = os.path.basename(path).split('.')[0]
im.save(os.path.join(parent_dir, img_name + 'r.jpg'), 'JPEG', quality=90)
def resize_all(mydir):
for subdir , _ , fileList in os.walk(mydir):
for f in fileList:
try:
full_path = os.path.join(subdir,f)
resize_im(full_path)
except Exception as e:
print('Unable to resize %s. Skipping.' % full_path)
if __name__ == '__main__':
resize_all(dir_path)
Будьте осторожны при сохранении изображения с измененным размером в том же каталоге, что и исходное изображение. Если вы запустите свой код дважды, он создаст множество дополнительных изображений с измененным размером.
Используйте
os.walk
вместоos.listdir
. Вы также можете использоватьpathlib.Path.glob
для выбора только файлов с заданным расширением. В любом случае будьте осторожны, чтобы сгенерировать все имена заранее, чтобы убедиться, что вы не повторяете вновь созданные файлы бесконечно.