python图片对比模块_python图像模块——从一张女神图开始(1)

上次我们用python完成了一个小任务:把一张200 * 200的图片变成了100 * 100。

程序如下:

from PIL import Image

img = Image.open('/Users/wangrenjie/Documents/photo/photo.jpeg')

w, h = img.size

img.thumbnail((w//2,h/2))

img.save('/Users/wangrenjie/Documents/photo/thumbphoto.jpeg','jpeg')

不知道你注意没有,这个小程序存在着很多问题,首先,如果我们选择的图片不存在会怎么样呢?

按照正常的逻辑,当我们没有找到这张图片的时候,我们应该停下这个程序的后续操作。那么如何实现呢?这里就需要使用判断语法if.

if 顾名思义就是“是否”,那么就是对后面的内容判断,是真是假。在程序中,我 们对判断的对象,是要求具有二象性的,也就是说它总是真或者就是假。通常我们用“1”来代表真,“0”代表假。这种变量还有另外一种称呼就是布尔变量。bool值只有两个“1”“0”。那么当我们去寻找这张图片之后,就要对其是否存在这个状态进行判断.可惜的是,当我们使用Image.open这个函数时,当我们直接对img 这个变量进行判断时,发现

也就是说Image这个工具为我们完成了太多的操作,以至于它只能去打开一个必须存在的图片,这在现实中是存在着逻辑的漏洞的,因为我们无法保证每次都有图片存在。

所以我们要把这一步进行拆分,第一步我们需要去查找图片是否存在,当存在的时候才会去利用Image.open进行操作。

值得欣慰的是,Image还提供了从文件IO获取图片。

这样我们修改程序:

当图片存在的时候,我们才会进行Image等操作,当打开文件失败,就会抛出异常,而走到异常分支except,最后当我们完成操作的时候,需要走finally分支将数据流断开,以免造成资源浪费和引入不确定的错误。

看到这里,不知道你注意到没有,这里有几个特殊的地方:

- 我们注意到这些代码之间存在着不同的缩进。try,else等顶格写,而分支下面的操作语句则缩进了四个空格。在python中缩进代表着代码间的附属关系,通常下一级要比上一级锁进四个空格。4是怎么来的呢?这是一个tab的长度,但是并不要因为是一个tab长度而随便使用tab来缩紧,因为在很多编辑器里面默认的tab很可能不是四个空格,需要你人工的设定。当然直接敲四个空格可能更准确但也更费时,所以写代码之前要确认好tab的长度。

- f= None 这是定义了一个变量,用于存储接收到的文件数据。None在python代表着空值,但和我们常见的“NULL”和“0”还不一样,在python中,认为所有的事物都是一个对象,也就是说python也是面向对象编程的。面向对象这个词汇,看起来很难理解,但是联系实际,你可能会更容易理解,在现实中,我们接触到的事物都是对象,所谓对象,就是一个由属性和行为组成的完整个体,它应该具有完整的数据和对数据操作的函数。

- try-except-finally 控制块,这在上面讲述了各个分支的含义,try-else-finally控制块,大多用于存在抛出异常操作的场景,这样有助于避免因异常而导致程序出错。记住:是必不可少的,这是开启本分支操作的和区分关键字和操作字的分隔符。

在实际中我们可能需要大量进行读写,但是如果每次都是用try-else-finally控制块,就显得很不方便了。所以python提供了with - as语法。

使用with-as改写上面的函数:

是不是变的更加的简洁了呢?

这样我们就可以把这个程序变得更加的健壮。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值