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):
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()
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)
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)