最近由于处理数据集的需要,要将一批图片按一定分辨率和长宽比进行调整,于是写了这个代码。此代码有以下功能:
①按照指定的分辨率将图片变形(此变形不会影响图片原有的比例,多出的部分会以灰色填充)
②当图片方向不为横向时将其旋转90度
核心代码为resize_img()
def resize_img(img, size):
iw,ih = img.size
w,h = size
scale = min(w/iw,h/ih) #获取变形比例
nw = int(iw*scale) #计算变形后的长宽
nh = int(ih*scale)
# 旋转
if(w>h & iw<ih):
img = img.rotate(-90)
# 变形
img = img.resize((nw,nh),Image.BICUBIC)
new_img = Image.new('RGB',size,(128,128,128)) #创建一张灰色背景
new_img.paste(img,((w-nw)//2,(h-nh)//2)) #将变形后的图片贴进背景中央
return new_img
其中rotate的判断条件和参数可以根据自己的需要调整
调用代码如下:
#----用以控制目标分辨率
sizeX = (4096,2160)
#--------------------
inFile = input("请输入文件夹路径")
outFile = input("请输入输出文件夹路径")
if (os.path.exists(outFile) == False):
os.mkdir(outFile) #当文件夹不存在时创建该路径
if(os.path.exists(inFile)):
fileList = os.listdir(inFile)
for file in fileList: # 遍历文件夹中所有文件
fullFile = inFile +'\\'+ str(file) #组合完整的输入路径
f = open(fullFile,'rb')
img = Image.open(f) #打开图片
newimg = resize_img(img, sizeX) #图片变形
print(file) #打印变形成功的文件
newimg.save(os.path.join(outFile,file))#
!!!save函数中必须使用os.path.join连接地址(直接使用+连接会报错)
同时可以使用下列代码来判断文件类型以过滤数据
if(filetype.lower,'.jpg'or filetype.lower=='.jpge' or filetype.lower=='.png'):