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

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

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

  filenames=glob('{}/*'.format(source_dir))

  我们使用了星号(*)作为通配符,意味着我们要查找image目录下所有文件的名称。

  输出filenames试试看。

  print(filenames)

  ['image/squirrel.png','image/cat.png']

  可见filenames是个列表,里面包含了咱们需要处理的全部图片文件。

  下面,我们就来尝试检测每张图片的大小。

  forfilenameinfilenames:

  withImage.open(filename)asim:

  width,height=im.size

  print(filename,width,height,os.path.getsize(filename))

  我们遍历filenames中的所有图片路径,用PIL对象的size属性获得图片的宽度(width)和高度(height)数值。用os.path.getsize()函数来获取文件大小。

  然后,我们把这些内容按文件分别打印出来。

  ('image/squirrel.png',1024,768,1466487)

  ('image/cat.png',2067,1163,2851538)

  因为我们需要判断某张图片的大小是否超出微信公众平台设置的2M阈值,因此我们需要计算一下,2M阈值换算成比特,到底是个多大的的数字,以便后面的比对。

  2*1024*1024

  计算结果如下:

  2097152

  显然,刚才的打印结果里面,cat.png图像超出了这个阈值。

  我们心里有数了。

  下面就把阈值(threshold)设置为这个数值。

  threshold=2*1024*1024

  我们来看看自己的直觉和程序判断的实际情况是否一致:

  forfilenameinfilenames:

  filesize=os.path.getsize(filename)

  iffilesize>=threshold:

  print(filename)

  此处我们要求Python打印全部超出阈值的文件路径。结果如下:

  image/cat.png

  测试结果正确。程序只需要调整猫咪照片的尺寸。

  正式进行压缩和输出之前,我们需要建立输出目录。虽然前面我们设定了,这个子目录叫做output,但是实际的演示目录里,它还尚未创建。

  我们先用os.path.exists()函数判定这个目录是否存在。当判定为不存在时,我们采用os.makedirs()函数来创建它。

  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)

  print('adjustedsize:',new_width,new_height)

  我们把新的宽度设置为了1024,然后按照同等宽高比例算出新的高度取值。

  注意这里宽度和高度必须设置为整数类型,否则会报错。

  输出结果如下:

  image/cat.png

  ('adjustedsize:',1024,576)

  为了把猫咪照片压缩为宽度1024的图片,我们需要设定高度为576,以保证压缩后的图片与原始图片的宽高比一致。

  下面我们续写函数,正式调用PIL的resize函数将新的图片设定为新的宽度和高度数值。然后,我们使用PIL的save函数,把生成的图片存储到指定的路径。

  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)

  输出结果还是需要压缩的图片路径。

  image/cat.png

  压缩成功了吗?

  我们打开样例目录看看。

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