zoukankan      html  css  js  c++  java
  • 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)
    
    
  • 相关阅读:
    LeetCode 914. 卡牌分组
    LeetCode 999. 车的可用捕获量
    LeetCode 892. 三维形体的表面积
    21航电5E
    min25筛 学习笔记
    牛客多校6G
    2021航电多校3
    2021牛客多校H
    [模版] 快速傅里叶变换
    2021牛客多校第五场
  • 原文地址:https://www.cnblogs.com/ChanWunsam/p/10018287.html
Copyright © 2011-2022 走看看