天天看點

python練手小程式—調整圖檔分辨率(大小)

在GitHub上發現一些很有意思的項目,由于本人作為Python的初學者,程式設計代碼能力相對薄弱,為了加強Python的學習,特此利用前輩們的學習知識成果,自己去親自實作。

一周沒有更新了,主要還是自己太懶,三分熱度,我想如果我繼續這樣下去,做什麼事都做不好,以此為戒,堅持一個月内練習完這些知識點!

來源:GitHub

Python練手小程式項目位址:https://github.com/Show-Me-the-Code/python

寫作日期:2019.12.08

今天練習第0005題,題目如下:

python練手小程式—調整圖檔分辨率(大小)

這個題目,調整照片的大小,主要是學會使用PIL庫中image.resize()函數。這裡存在一些細節,就是什麼時候調整圖檔大小,什麼時候不需要調整。因為題目給出不超過iPhone5分辨率的大小,我們假定iPhone5的分辨率(640, 1136),如果圖檔的實際分辨率(w, h),滿足以下條件:

  1. w <= 640 且 h <= 1136,那麼圖檔大小不需要調整。
  2. 根據長寬調整比例對比,w_ratio = w/640,h_ratio = h/1136:
    • 如果w_ratio>h_ratio,那麼以scale=w_ratio為基準,同時降低實際長寬,其實這裡寬計算出來是規定的寬,長按照基準調節即可。
    • 同樣,w_ratio<=h_ratio,以scale=h_ratio為基準,隻不過長計算出是規定的長而已。

Python代碼如下:

import os
from PIL import Image


def search_image(path):
    """
    在指定路徑下搜尋以'jpg', 'jpeg', 'png'字尾的圖檔名稱
    :param path:
    :return:
    """
    ext = ['jpg', 'jpeg', 'png']
    files = os.listdir(path)
    # print(files)
    image_files = list(filter(lambda x: x.split('.')[-1] in ext, files))
    return image_files


def process_image(filename, m_width=640, m_height=1136):
    """
    根據規定的長寬,調節實際圖檔的長寬
    :param filename:
    :param m_width:
    :param m_height:
    :return:
    """
    image = Image.open(filename)
    w, h = image.size
    # 圖檔尺寸長寬任何一個不超過規定的長寬,不做處理
    if w <= m_width and h <= m_height:
        print(filename, w, h)
        print(filename, 'is OK~')
        return
    print(filename, w, h)
    # 以規定的長寬縮短實際的長寬規則:
    # 寬比例大于長比例時,以寬比例做基準,也就是實際寬,調節到規定的寬;實際長,根據寬的調整比例去調節。
    # 長比例大于寬比例時,以長比例做基準,也就是實際長,調節到規定的長;實際寬按照相同比例調整。
    if 1.0*w/m_width > 1.0*h/m_height:
        scale = 1.0*w/m_width
        new_width = int(w / scale)
        new_height = int(h / scale)
        new_im = image.resize((new_width, new_height), Image.ANTIALIAS)
    else:
        scale = 1.0*h/m_height
        new_width = int(w / scale)
        new_height = int(h / scale)
        new_im = image.resize((new_width, new_height), Image.ANTIALIAS)
    # 儲存調整後的圖檔
    new_im.save('new-' + filename)
    new_im.close()


if __name__ == '__main__':
    file_names = search_image('.')
    for file in file_names:
        process_image(file)

           
上一篇: 佛說