【每周一坑】缩小图片尺寸

简介: 我们知道,通常来说一张图片的分辨率越高,它就越清晰,但文件占用的空间就越大。有时候我们并不需要那么高的清晰度,而是希望图片占用空间可以小一些。

之前我们的题目大多偏向解决数学问题,今天来一道偏应用的:


我们知道,通常来说一张图片的分辨率越高,它就越清晰,但文件占用的空间就越大。有时候我们并不需要那么高的清晰度,而是希望图片占用空间可以小一些。那么只要将图片的长宽缩小即可,几乎所有的图片处理软件都支持这个功能。不过如果有许多张图片需要压缩,一张张手动处理实在是太低效。虽然很多软件也提供了批量处理的功能,不过我们是编程教室啊,所以我们偏要用 Python 代码来解决这个问题……


那么今天的任务就是:用一段代码来压缩图片大小。提示,可以使用 Pillow 库来解决。


实现单张图片的压缩不难,所以附加题,将这段代码制作成一个命令行工具,使其可以:


  1. 指定要压缩的图片文件
  2. 如果指定的是一个目录,则压缩整个目录里的图片
  3. 指定压缩的比率
  4. 指定输出的文件路径
  5. 选择是否保留原始图片


推荐使用 argparse 模块实现。



期待各位同学提交解答。


提交代码可以使用 paste.ubuntu.com 或 codeshare.io 等代码分享网站,只需将代码复制上去保存,即可获得一个分享地址,非常方便。


往期问题可通过公众号菜单栏“课外辅导”栏目中进入查看。


【解答】谁是哪国人?


上次我有说过,类似的逻辑判断题,都可以有相似的编程解法,那就是:


列出所有的情况,然后一个个比对,是否符合条件。


看上去这是一个很“笨”的办法,但它却很直观,很“程序化”。


有些解答用了更巧妙的方法,用排除法直接找出可正确匹配国籍的一位(C),再依次找出剩下的。这没有问题。不过我更倾向于纯粹的程序解法,代码的可读性上更好。


当然,比起用 6 层 for 循环列出所有情况,有一个更好的办法,就是 itertools 模块的 permutations 方法,它会生成列表元素的全排列:


import itertools
p = itertools.permutations(range(3))
for i in p:
    print(i)


输出:


(0, 1, 2)
(0, 2, 1)
(1, 0, 2)
(1, 2, 0)
(2, 0, 1)
(2, 1, 0)


参考 @徐大龙 同学的代码:


import itertools
countries = ['Ameria', 'Germany', 'England', 'France', 'Russia', 'Italy']
persons = ['A', 'B', 'C', 'D', 'E', 'F']
for res in itertools.permutations(persons, 6):
    # A,E,C不是美国人,俄国人,德国人
    if res[0] in 'AEC' or res[4] in 'AEC' or res[1] in 'AEC':
        continue
    # B,F不是德国人
    if res[1] == 'B' or res[1] == 'F':
        continue
    # A不是法国人,C不是意大利人
    if res[3] == 'A' or res[5] == 'C':
        continue
    # B不是美国人,C不是法国人
    if res[0] == 'B'or res[3] == 'C':
        continue
    print(sorted(zip(res, countries), key=lambda t: t[0]))


@王任 给了个一行代码的版本:


_ = [print(i) for p in __import__('itertools').permutations('美俄德法意英') if all([p[0] not in "美俄德法", p[1] not in "德美", p[2] not in "美俄德意法", p[4] not in "美俄德", p[5] not in "德"]) for i in zip('ABCDEF', p)]


其他完成的同学:


鼠赽 / 听雨 / Seerz / Don human Edshot machine / 你有靐吗


非常感谢大家的参与!


  • 点击左下角“阅读原文”,可查看Python教程及更多学习资源
  • 代码问题请在论坛 bbs.crossincode.com 上发帖提问
  • 欢迎加入讨论交流群组共同学习进步
  • 别忘了将我们的文章转发朋友圈或在知乎上为我们的专栏点赞,你们的支持将会让编程教室做得更好:)


近期文章推荐阅读:

Python有嘻哈:Crossin教你用代码写出押韵的verse

听说你好不容易写了个爬虫,结果没抓几个就被封了?

编程新手:看懂很多示例,却依然写不好一个程序

喏,你们要的 PyCharm 快速上手指南

几个以前发过、回复过很多次、比较有用的学习资源

给伸手党的福利:Python 新手引导

数据分析:当赵雷唱民谣时他唱些什么?

Python 爬虫爬取美剧网站

爆款游戏《贪吃蛇大作战》的 Python 实现

相关文章
|
4月前
|
前端开发
背景滑动,动感加倍:CSS动画对角线效果全解析!
背景滑动,动感加倍:CSS动画对角线效果全解析!
|
5月前
|
容器
软件开发常见流程之物理像素导致图片变形问题如何解决,先把图缩放为原先的两倍,再缩放,利用Cutterman生成矢量图
软件开发常见流程之物理像素导致图片变形问题如何解决,先把图缩放为原先的两倍,再缩放,利用Cutterman生成矢量图
|
7月前
|
编解码 JavaScript 算法
通过PHAsset获取的图片上传后变大和图像被旋转90度问题完美解决方案
通过PHAsset获取的图片上传后变大和图像被旋转90度问题完美解决方案
100 4
|
7月前
|
机器学习/深度学习
leetcode代码记录(旋转图像
leetcode代码记录(旋转图像
43 0
|
移动开发 小程序 JavaScript
小程序图片左右摆动效果
小程序图片左右摆动效果
112 0
|
计算机视觉
第三周作业:matlab将一张图片进行顺时针旋转 20°,做水平镜像,做错切变换,缩小图像处理,并采用双线性插值方法
简介:第三周作业:matlab将一张图片进行顺时针旋转 20°,做水平镜像,做错切变换,缩小图像处理,并采用双线性插值方法
第三周作业:matlab将一张图片进行顺时针旋转 20°,做水平镜像,做错切变换,缩小图像处理,并采用双线性插值方法
|
数据安全/隐私保护
推荐五个好用的小软件,放大快乐,缩小悲伤
分享是一种力量,它能放大快乐,它能缩小悲伤,我喜欢分享一些好用的软件给大家,今天也要继续这个习惯,为大家介绍五个好用的小软件。
95 0
|
SQL 算法 索引
坚持写算法题的第四周(二)
坚持写算法题的第四周(二)
122 0
坚持写算法题的第四周(二)
|
算法
坚持写算法题的第四周(四)
坚持写算法题的第四周(四)
119 0
坚持写算法题的第四周(四)
|
编解码
音视频开发: ffmpeg保持原视频比例增加黑色背景(画黑边)
音视频开发: ffmpeg保持原视频比例增加黑色背景(画黑边)
976 0
音视频开发: ffmpeg保持原视频比例增加黑色背景(画黑边)