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中如何遍历文件夹及其子文件夹中的所有文件(附实现代码)

  • 9
    点赞
  • 36
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

落花逐流水

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值