需求分析
在做 CV 等任务时,会遇到对图像进行批量操作的情况,本篇文章接上篇
使用python语言递归遍历父文件夹下子目录中的图像并进行批量化操作的方法案例
,继续针对resize的操作进行研究。
异同
上篇文章中使用到了
thumbnail
进行图像的resize操作,不过该方法和
resize
的方法是有区别的,详见
python:PIL库中Image类thumbnail方法和resize方法的比较
这篇文章
1
。
代码实现
本案例仍是对
'./img'
这个父文件夹下的子文件夹中的图像进行批量裁剪操作,文件夹目录结构如下(其中
'./img'
为父文件夹,
A
、
B
…
Z
为父文件夹下的各个子文件夹):
-<img>
-<A>
-图片.jpg
-图片.jpg
...
-图片.jpg
-<B>
-图片.jpg
-图片.jpg
...
-图片.jpg
...
-<Z>
-图片.jpg
-图片.jpg
...
-图片.jpg
本案例在上篇文章的基础上进行修改,实现代码如下
2
:
import os
import shutil
import time
from time import sleep
from PIL import Image
from tqdm import tqdm
def makeDirs(path):
# 创建新的输出子目录,若存在输出该目录则删除该目录及其子文件夹和文件
if os.path.exists(path):
shutil.rmtree(path)
os.mkdir(path)
def resizePics():
# default_path=os.getcwd() ##设置默认打开目录,即当前目录
# default_path = "/pics"
# inpath = os.getcwd()
# inpath = './img'
inpath = './img'
# inpath = './img'
outdir = os.path.basename(inpath) + '_resize'
outpath = os.path.join(os.path.dirname(inpath), outdir)
makeDirs(outpath)
# 列出所在目录下的所有目录和文件
lists = os.listdir(inpath)
starttime = time.time()
for i in tqdm(range(0, len(lists))):
subdir = lists[i]
subpath = inpath + "/" + subdir # 子目录路径
if os.path.isdir(subpath):
# outsubdir = subdir + '-resize'
outsubdir = subdir
outsubpath = os.path.join(outpath, outsubdir)
makeDirs(outsubpath)
# 对文件夹下的照片文件调整大小
# 列出某个子目录下的所有文件和目录
flists = os.listdir(subpath)
for j in tqdm(range(0, len(flists))):
sleep(0.01)
fname = flists[j]
fpath = subpath + "/" + fname
# 以下改动
outfile = outsubpath + '\\' + fname
width = 128
height = 128
if os.path.isfile(fpath):
# resizeSinglePic(fname, fpath, outsubpath)
image = Image.open(fpath)
image_size = image.resize((width, height), Image.ANTIALIAS)
image_size.save(outfile)
passtime = time.time()-starttime
print('照片压缩完毕,总共花费了 %f s' % (passtime))
# def resizeSinglePic(fname, fpath, outsubpath):
# fbasename = os.path.basename(fpath)
# fext = os.path.splitext(fpath)[-1]
# if fext in img_ext:
# img = Image.open(fpath)
# # img.thumbnail(size)
# img.resize(128, 128)
# outfile = outsubpath + "/" + fbasename
# img.save(outfile)
# img_ext = ['.bmp', '.jpeg', '.JPEG','.gif', '.psd', '.png', '.JPG', '.jpg']
# size = (128, 128)
resizePics()
代码中使用到的
resize
方法灵感来自于
img.resize()函数的作用和用法-单张图像变换大小
这篇文章
3
,并参考了
使用python对文件夹内的照片进行批量修改尺寸
这篇文章
4
。
通过上述代码,即可实现对
'./img'
父文件夹下
A
、
B
…
Z
这些子文件夹中图像的批量 resize 操作。
写到这里,差不多本文就要结束了。如果有问题可以在下方留言区留言交流。如果我的这篇文章帮助到了你,那我也会感到很高兴,
一个人能走多远,在于与谁同行
。