python练习册第五题
题目
你有一个目录,装了很多照片,把它们的尺寸变成都不大于 iPhone5 分辨率 (1136*640)的大小。
解题思路
涉及到图片的都要用到Image
模块,读取图片然后解析,解析后的字符串中某个地方表示图片的分辨率,可以依此来判断是否符合标准——如果不符合,就需要将图片等比例压缩到一个恰好合适的大小。这应该就是全部的步骤。
这里有几个问题需要解决:
- 不可能再按照图片名一个一个读取了,怎么通过扩展名来读取图片;
- 读取的图片信息需要解析,还要判断是否为图片格式以及是否符合分辨率标准;
- 等比例压缩怎么确定合适范围
解题代码
我写完后对比了别人的方法,发现我错会题目意思了。他们只是要小于这个分辨度就好,而我的是把图片放缩到分辨度下最合适的那个大小。emmm,有点手机像点击缩略图然后打开看的那种意思吧。
另外一点就是没办法做到自动搜索所有的图片,所以我又参照大神的方法修改了一下。
import os
import sys
import logging
from PIL import Image
logging.basicConfig(level=logging.INFO)
EXName = ('.png', '.jpg', '.jpeg')
def select_factor(fw, fh):
if fw >= 1:
if fh >= 1:
return min(fw, fh)
else:
return fh
else:
if fh < 1:
return min(fw, fh)
else:
return fw
def Newsize(image):
size = [640, 1136]
factor_w = size[0] / float(image.size[0])
factor_h = size[1] / float(image.size[1])
factor = select_factor(factor_w, factor_h)
return tuple([int(x * factor) for x in image.size])
#for infile in sys.argv[1:]:
files = os.listdir('.')
for infile in files:
file_name = os.path.splitext(infile)[0]
ex_name = os.path.splitext(infile)[1]
ex_name = ex_name if ex_name != '.jpg' else '.jpeg' # 保存格式不能是'.jpg'
if ex_name in EXName:
outfile = file_name + "_new" + ex_name
try:
im = Image.open(infile)
old_size = im.size
new_size = Newsize(im)
im.resize(new_size, Image.ANTIALIAS).save(outfile, ex_name[1:])
logging.info("image resized from {0} to {1}".format(
old_size, new_size))
except IOError:
print('cannot resize %s' % infile)