python实现图片批量压缩

作者:陨落&新生 时间:2022-01-20 03:03:20 

项目中大量用到图片加载,由于图片太大,加载速度很慢,因此需要对文件进行统一压缩

第一种

 一:安装包


python -m pip install Pillow

二:导入包


from PIL import Image
import os

三:获取图片文件的大小


def get_size(file):
   # 获取文件大小:KB
   size = os.path.getsize(file)
   return size / 1024

四:输出文件夹下的文件


dir_path = r'file_path'
items = os.listdir(dir_path)

for item in items:
   # print(item)
   path = os.path.join(dir_path, item)
   print(item)

五:压缩文件到指定大小,我期望的是150KB,step和quality可以修改到最合适的数值


def compress_image(infile, outfile=None, mb=150, step=10, quality=80):
   """不改变图片尺寸压缩到指定大小
   :param infile: 压缩源文件
   :param outfile: 压缩文件保存地址
   :param mb: 压缩目标,KB
   :param step: 每次调整的压缩比率
   :param quality: 初始压缩比率
   :return: 压缩文件地址,压缩文件大小
   """
   if outfile is None:
       outfile = infile
   o_size = get_size(infile)
   if o_size <= mb:
       im = Image.open(infile)
       im.save(outfile)

while o_size > mb:
       im = Image.open(infile)
       im.save(outfile, quality=quality)
       if quality - step < 0:
           break
       quality -= step
       o_size = get_size(outfile)

六:修改图片尺寸,如果同时有修改尺寸和大小的需要,可以先修改尺寸,再压缩大小


def resize_image(infile, outfile='', x_s=800):
   """修改图片尺寸
   :param infile: 图片源文件
   :param outfile: 重设尺寸文件保存地址
   :param x_s: 设置的宽度
   :return:
   """
   im = Image.open(infile)
   x, y = im.size
   y_s = int(y * x_s / x)
   out = im.resize((x_s, y_s), Image.ANTIALIAS)

out.save(outfile)

七:运行程序


if __name__ == '__main__':
                     # 源路径      # 压缩后路径
   compress_image(r"file_path", r"E:\docs\2.JPG")
                   # 源路径      # 压缩后路径
   resize_image(r"file_path", r"E:\docs\3.JPG")

第二种


import os
from PIL import Image
import threading,time

def imgToProgressive(path):
   if not path.split('.')[-1:][0] in ['png','jpg','jpeg']:  #if path isn't a image file,return
       return
   if os.path.isdir(path):
       return
##########transform img to progressive
   img = Image.open(path)
   destination = path.split('.')[:-1][0]+'_destination.'+path.split('.')[-1:][0]
   try:
       print(path.split('\\')[-1:][0],'开始转换图片')
       img.save(destination, "JPEG", quality=80, optimize=True, progressive=True) #转换就是直接另存为
       print(path.split('\\')[-1:][0],'转换完毕')
   except IOError:
       PIL.ImageFile.MAXBLOCK = img.size[0] * img.size[1]
       img.save(destination, "JPEG", quality=80, optimize=True, progressive=True)
       print(path.split('\\')[-1:][0],'转换完毕')
   print('开始重命名文件')
   os.remove(path)
   os.rename(destination,path)

for d,_,fl in os.walk(os.getcwd()):    #遍历目录下所有文件
   for f in fl:
       try:
           imgToProgressive(d+'\\'+f)
       except:
           pass

来源:https://www.cnblogs.com/shizhengwen/p/14638246.html

标签:python,图片,压缩
0
投稿

猜你喜欢

  • 用Python Flask创建简洁高效的URL短链接服务

    2022-10-12 16:21:49
  • python dataframe astype 字段类型转换方法

    2022-02-19 07:58:50
  • 解决iframe的frameborder在chrome/ff/ie下的差异

    2023-08-09 00:23:24
  • 将pip源更换到国内镜像的详细步骤

    2021-01-13 07:33:00
  • django框架事务处理小结【ORM 事务及raw sql,customize sql 事务处理】

    2022-02-27 23:20:03
  • Win7或Windows server 2008中IIS7支持ASP+Access解决方法

    2012-03-27 18:31:27
  • 基于opencv实现简单画板功能

    2022-08-25 14:41:41
  • oracle删除表字段和oracle表增加字段

    2023-07-16 10:52:18
  • 提高Python生产力的五个Jupyter notebook插件

    2021-06-01 12:52:33
  • Python中Flask-RESTful编写API接口(小白入门)

    2023-02-07 10:47:46
  • python使用matplotlib显示图像失真的解决方案

    2021-03-30 22:31:02
  • python 对任意数据和曲线进行拟合并求出函数表达式的三种解决方案

    2021-10-02 12:40:16
  • python利用 pytesseract快速识别提取图片中的文字((图片识别)

    2023-06-16 08:00:18
  • Python 列表(List)操作方法详解

    2023-06-15 10:10:04
  • 网站通过W3C标准注意点

    2010-01-14 20:15:00
  • Python手动或自动协程操作方法解析

    2023-06-30 11:38:41
  • python实现图片文件批量重命名

    2023-08-10 03:39:57
  • 使用Python Fast API发布API服务的过程详解

    2022-05-19 20:03:44
  • python+selenium实现简历自动刷新的示例代码

    2023-11-27 16:13:01
  • 表单系列·出错字段排行榜

    2008-07-01 12:57:00
  • asp之家 网络编程 m.aspxhome.com