python批量旋转图片

工作中偶尔会用到图像批量选装,找工具有点麻烦,就查了一下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中如何遍历文件夹及其子文件夹中的所有文件(附实现代码)

你可能感兴趣的:(python)