1. 程式人生 > >python練習冊第五題

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)