python练习册第五题

题目

你有一个目录,装了很多照片,把它们的尺寸变成都不大于 iPhone5 分辨率 (1136*640)的大小。

解题思路

涉及到图片的都要用到Image模块,读取图片然后解析,解析后的字符串中某个地方表示图片的分辨率,可以依此来判断是否符合标准——如果不符合,就需要将图片等比例压缩到一个恰好合适的大小。这应该就是全部的步骤。

这里有几个问题需要解决:

  1. 不可能再按照图片名一个一个读取了,怎么通过扩展名来读取图片;
  2. 读取的图片信息需要解析,还要判断是否为图片格式以及是否符合分辨率标准;
  3. 等比例压缩怎么确定合适范围

解题代码

我写完后对比了别人的方法,发现我错会题目意思了。他们只是要小于这个分辨度就好,而我的是把图片放缩到分辨度下最合适的那个大小。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)

原文地址:https://www.cnblogs.com/ChanWunsam/p/10018287.html