python練習冊第五題
阿新 • • 發佈:2018-11-26
題目
你有一個目錄,裝了很多照片,把它們的尺寸變成都不大於 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)