工作中偶尔会用到图像批量选装,找工具有点麻烦,就查了一下python脚本。
双击一下就能完成的任务,为啥非要找工具呢,是吧。
#-*- coding: UTF-8 -*-
from PIL import Image
import os
# 获得文件夹下所有文件
filePath = './imgs/'
filenames = os.listdir(filePath)
# 指定保存的文件夹
outputPath = './imgs_rotate/'
# 迭代所有图片
for filename in filenames:
# 读取图像
im = Image.open(filePath + filename)
# 指定逆时针旋转的角度
im_rotate = im.transpose(Image.ROTATE_90)
# im_rotate = im.transpose(Image.ROTATE_180)
# im_rotate = im.transpose(Image.ROTATE_270)
# 保存图像
im_rotate.save(outputPath + filename)
因为还需要遍历文件夹,所以又查了一下遍历的脚本:
import os
# 遍历文件夹及其子文件夹中的文件,并存储在一个列表中
# 输入文件夹路径、空文件列表[]
# 返回 文件列表Filelist,包含文件名(完整路径)
def get_filelist(dir, Filelist):
newDir = dir
if os.path.isfile(dir):
Filelist.append(dir)
# # 若只是要返回文件文,使用这个
# Filelist.append(os.path.basename(dir))
elif os.path.isdir(dir):
for s in os.listdir(dir):
# 如果需要忽略某些文件夹,使用以下代码
# if s == "xxx":
# continue
newDir = os.path.join(dir, s)
get_filelist(newDir, Filelist)
return Filelist
if __name__ == '__main__':
list = get_filelist('.\\imgs', [])
print(len(list))
for e in list:
print(e)
或者:
import os
def get_filelist(path):
Filelist = []
for home, dirs, files in os.walk(path):
for filename in files:
# 文件名列表,包含完整路径
Filelist.append(os.path.join(home, filename))
# # 文件名列表,只包含文件名
# Filelist.append( filename)
return Filelist
if __name__ == "__main__":
path = '.\\imgs'
Filelist = get_filelist(path)
print(len(Filelist))
for file in Filelist:
print(file)
整理到一起就是:
#-*- coding: UTF-8 -*-
from PIL import Image
import os
def get_filelist(path):
Filelist = []
for home, dirs, files in os.walk(path):
for filename in files:
# 文件名列表,包含完整路径
Filelist.append(os.path.join(home, filename))
# # 文件名列表,只包含文件名
# Filelist.append( filename)
return Filelist
if __name__ == "__main__":
filePath = './imgs'
# 指定保存的文件夹
outputPath = './imgs_rotate'
# 获得文件夹下所有文件
# filePath = './imgs/' # 只能获取当前路径下的文件,不能递归
# filenames = os.listdir(filePath)
Filelist = get_filelist(filePath)
print(len(Filelist))
# 迭代所有图片
for filename in Filelist:
print(filename)
# 读取图像
im = Image.open(filename)
# 指定逆时针旋转的角度
im_rotate = im.transpose(Image.ROTATE_90)
# im_rotate = im.transpose(Image.ROTATE_180)
# im_rotate = im.transpose(Image.ROTATE_270)
# 保存图像
output_path = filename.replace(filePath, outputPath)
outputdir = output_path.rsplit('\\', 1)[0]
if not os.path.exists(outputdir):
os.mkdir(outputdir)
im_rotate.save(output_path)
或者:
#-*- coding: UTF-8 -*-
from PIL import Image
import os
import cv2
def get_filelist(path):
Filelist = []
for home, dirs, files in os.walk(path):
for filename in files:
# 文件名列表,包含完整路径
Filelist.append(os.path.join(home, filename))
# # 文件名列表,只包含文件名
# Filelist.append( filename)
return Filelist
if __name__ == "__main__":
filePath = '.\\imgs'
# 指定保存的文件夹
outputPath = '.\\imgs_rotate'
# 获得文件夹下所有文件
# filePath = './imgs/' # 只能获取当前路径下的文件,不能递归
# filenames = os.listdir(filePath)
Filelist = get_filelist(filePath)
print(len(Filelist))
# 迭代所有图片
for filename in Filelist:
print(filename)
# 读取图像
# im = Image.open(filename)
im = cv2.imread(filename)
im_rotate = cv2.flip(im, -1) # 原图顺时针旋转180度
# 指定逆时针旋转的角度
# image = cv2.transpose(im) #转置图像
# im_rotate = cv2.flip(image, 1) # 等于原图顺时针旋转90度
# im_rotate = cv2.flip(image, 0) # 等于原图顺时针旋转270度
# im_rotate = im.transpose(Image.ROTATE_90)
# im_rotate = im.transpose(Image.ROTATE_180)
# im_rotate = im.transpose(Image.ROTATE_270)
# 保存图像
output_path = filename.replace(filePath, outputPath)
outputdir = output_path.rsplit('\\', 1)[0]
if not os.path.exists(outputdir):
os.mkdir(outputdir)
# im_rotate.save(output_path)
cv2.imwrite(output_path, im_rotate)
使用PIL或者opencv的90°、180°、270°的旋转都可以达到效果,但是不知道为什么,使用PIL旋转的占用内存会比原图小,使用opencv旋转的占用内存会比原图大。
参考:【python图像处理】图像的缩放、旋转与翻转
参考:python中如何遍历文件夹及其子文件夹中的所有文件(附实现代码)