天天看点

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)

           
上一篇: 佛说