python图片旋转

python图片旋转

  • 少废话,直接上代码
#!/usr/bin/env python

import os
from optparse import OptionParser
from sys import stdout

# 导入损坏图片
from PIL import ImageFile, Image
ImageFile.LOAD_TRUNCATED_IMAGES = True

# 计数器
def out_hint(total=[0]):
    total[0] += 1
    stdout.write('generating %6dimgs...\r' % total[0])
    stdout.flush()

# 新建文件夹
def make_folder(folder_name):
    if not os.path.exists(folder_name):
        os.mkdir(folder_name)

# 命令行获取参数
def get_from_user():
    parser = OptionParser()
    # 源文件夹
    parser.add_option('-r', '--root_folder',
                      action='store', type='string',
                      dest='root_folder')
    # 目的文件夹
    parser.add_option('-t', '--target_folder',
                      action='store', type='string',
                      dest='target_folder')
    # 旋转角度列表
    parser.add_option('-a', '--angels', type='string',
                      action='store', dest='angels')

    options, args = parser.parse_args()

    root_folder = options.root_folder
    if root_folder is None:
        print 'please set the root_folder...'
        quit()
    elif root_folder.endswith(os.sep):
        root_folder = root_folder[:-1]

    target_folder = options.target_folder
    if target_folder is None:
        target_folder = root_folder + '_rotate'
    check_folder(target_folder)

    if options.angels is None:
        print 'please set the angels...'
        quit()
    angels = []
    for angel in options.angels.split(','):
        angels.append(float(angel))

    return root_folder, target_folder, angels

# 寻找最近角度
def get_nearest(angel):
    points = [0, 90, 180, 270]
    min_point = 0
    min_delta = 360
    for point in points:
        delta = abs(angel - point)
        if delta <= min_delta:
            min_delta = delta
            min_point = point

    return min_point


def rotate_img(img, file_name, angel):
    new_file_name = file_name.replace('.jpg', '_rotate_' + str(angel) + '.jpg')
    new_file_path = os.path.join(target_folder, new_file_name)

    if not os.path.exists(new_file_path):
        # 先旋转为0°, 90°, 180°, 270°,再进行角度微调
        min_point = get_nearest(angel)
        if min_point == 0:
            pass
        elif min_point == 90:
            img = img.transpose(Image.ROTATE_90)
        elif min_point == 270:
            img = img.transpose(Image.ROTATE_270)
        elif min_point == 180:
            img = img.transpose(Image.ROTATE_180)

        if angel - min_point != 0:
            img = img.rotate(angel - min_point, resample=Image.BILINEAR)

        img.save(new_file_path)


def rotate_imgs(file_name, angels):
    out_hint()
    # 只处理‘jpg’文件
    if not file_name.endswith('.jpg'):
        print '\nerror: %s\n' % file_name
        return

    file_path = os.path.join(root_folder, file_name)
    img = Image.open(file_path)
    # 对于‘PNG’图片
    img = img.convert('RGB')

    for angel in angels:
        rotate_img(img, file_name, angel)


if __name__ == '__main__':

    root_folder, target_folder, angels = get_from_user()

    file_names = os.listdir(root_folder)
    map(lambda fn: rotate_imgs(fn, angels), file_names)

你可能感兴趣的:(python)