您当前的位置:首页 > 新闻中心 > 综合新闻

如何用Python智能批量压缩图片

时间:2017-12-22 11:06:02  

  可以看到,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)

来顶一下
返回首页
返回首页
发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表
推荐资讯
相关文章
    无相关信息
栏目更新
栏目热门