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

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

我们知道,通常来说一张图片的分辨率越高,它就越清晰,但文件占用的空间就越大。有时候我们并不需要那么高的清晰度,而是希望图片占用空间可以小一些。那么只要将图片的长宽缩小即可,几乎所有的图片处理软件都支持这个功能。不过如果有许多张图片需要压缩,一张张手动处理实在是太低效。虽然很多软件也提供了批量处理的功能,不过我们是编程教室啊,所以我们偏要用 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 上发帖提问
  • 欢迎加入讨论交流群组共同学习进步
  • 别忘了将我们的文章转发朋友圈或在知乎上为我们的专栏点赞,你们的支持将会让编程教室做得更好:)

原文发布于微信公众号 - Crossin的编程教室(crossincode)

原文发表时间:2017-09-08

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏宏伦工作室

深度有趣 | 01-02 前言和准备工作

用 Python 做一些有意思的案例和应用,内容和领域不限,可以包括数据分析、自然语言理解、计算机视觉,等等等等

11320
来自专栏FreeBuf

Meterpreter免杀及对抗分析

0x00 前言 本文就常见的一些杀毒软件检测方法及meterpreter远控对抗杀毒软件的思路进行了一些介绍,相关内容可以参考我的上一篇文章meterprete...

52090
来自专栏知晓程序

晓快讯 | 微信公众号可以改错错错错错字了!

2 月 8 日凌晨,微信公众平台发布公告,称「为了给运营者、读者提供更友好的编辑、阅读体验,公众平台新增修改文章错别字功能」,支持运营者对已群发文章进行小范围修...

14030
来自专栏AI研习社

Github 项目推荐 | SpaceX Falcon 9 Box2D 回收降落动作模拟器

这是一款 SpaceX Falcon 9 第一级火箭的垂直火箭着陆模拟器,该模拟器用 Python 3.5 开发并且在 OpenAI Gym 环境中编写。该模拟...

14920
来自专栏机器之心

TensorFlow初学者指南:如何为机器学习项目创建合适的文件架构

选自MetaFlow 作者:Morgan 机器之心编译 参与:李亚洲、蒋思源 在这篇文章中,作者根据自己的经验为 TensorFlow 初学者给出了设计文件、文...

39060
来自专栏机器之心

资源 | 神经网络框架Chainer发布2.0正式版:CuPy独立

选自GitHub 机器之心编译 参与:李泽南、吴攀 Chainer 是一个灵活的神经网络框架,它的一个主要目标就是展现灵活性,允许我们用简单直观的方式编写出复...

490130
来自专栏xiaoxi666的专栏

【开源项目】扫雷

项目地址:https://github.com/xiaoxi666/mines_sweeper

17620
来自专栏奇点大数据

支付宝如何优化移动端深度学习引擎?

由于移动端资源的限制,大部分深度学习引擎都部署在云端,移动设备获取到输入数据,经过简单的加工,发送给云端,云端服务器经过深度神经网络推断运算,得到结果并反馈给移...

12030
来自专栏进击的程序猿

袖珍分布式系统(二)

本文是Distributed systems for fun and profit的第二部分,本文是阅读该文后的一些记录。

10720
来自专栏吉浦迅科技

DAY24:阅读SIMT架构

28530

扫码关注云+社区

领取腾讯云代金券