|

可以看到,output子目录已经自动生成。里面有一张图片。名称依然是cat.png。它的大小已经变成了836KB。我们打开它,看看显示是否正确。

依然是这张可爱的猫咪。看不出与原图有什么显著的区别,而且宽高比也正常。测试成功。
整合
但是这里,我们还需要完成一个重要步骤——把之前的代码进行整合。
许多初学者写代码,总会忽略这一步。
虽然你的代码已经成功完成了预期的任务,但如不及时进行整理,过一段时间再来看,你会抓不住头绪。
想想看,等你回来的时候,你的JupyterNotebook是这个样子的:
你不仅会忘了不同函数之间的调用关系,而且对于哪些参数需要设定,都一头雾水。
没错,这就是人脑的工作特点——我们会遗忘。
所以,趁热打铁,把你做过的功能进行模块化整合很有必要。
整合后,你实现的功能就成了一个有机的整体,只通过参数和外部交互。你只需要用注释告诉自己参数设置的含义。后面再需要调用相关功能的时候,就可以直接通过参数变化,拿来就用了。
趁着记忆犹新,咱们把刚刚全部的功能整合到一个函数里面。
defresize_images(source_dir,target_dir,threshold):
filenames=glob('{}/*'.format(source_dir))
ifnotos.path.exists(target_dir):
os.makedirs(target_dir)
forfilenameinfilenames:
filesize=os.path.getsize(filename)
iffilesize>=threshold:
print(filename)
withImage.open(filename)asim:
width,height=im.size
new_width=1024
new_height=int(new_width*height*1.0/width)
resized_im=im.resize((new_width,new_height))
output_filename=filename.replace(source_dir,target_dir)
resized_im.save(output_filename)
这个函数暴露给外部的接口,是3个参数:
source_dir:图片源目录
target_dir:压缩图片输出目录
threshold:阈值
检查一下,我们会发现不对劲的地方——虽然阈值是我们将来可以调整的选项,但是压缩的时候,图片的宽度却是手动设定的数值(1024)。这样将来面对一个阈值高出3倍的写作平台,我们依然把图片压缩到这么小,似乎有些矫枉过正。
另外,如果这张图片是那种极为长的图,那即便宽度不是很长,也可能会因为高度超出阈值。单纯调整宽度到1024,也许会失效。
解决办法也很简单,我们设置高度,然后对应调整宽度。
你可以看到,因为我们把代码集成整理在一处,许多原先我们可能考虑不周的问题,此时就纷纷显现了出来。
了解了问题所在,我们来调整一下代码。
我们因为要通过阈值计算宽度或者高度,所以需要引入数学计算模块。
importmath
调整后的函数如下:
defresize_images(source_dir,target_dir,threshold):
filenames=glob('{}/*'.format(source_dir))
ifnotos.path.exists(target_dir):
os.makedirs(target_dir)
forfilenameinfilenames:
filesize=os.path.getsize(filename)
4/5 首页 上一页 2 3 4 5 下一页 尾页 |