python实现图片批量压缩


Posted in Python onApril 24, 2021

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

第一种

 一:安装包

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

 

以上就是python实现图片批量压缩的详细内容,更多关于python 图片压缩的资料请关注三水点靠木其它相关文章!

Python 相关文章推荐
python中MySQLdb模块用法实例
Nov 10 Python
python去除空格和换行符的实现方法(推荐)
Jan 04 Python
详解Python之数据序列化(json、pickle、shelve)
Mar 30 Python
python学习教程之Numpy和Pandas的使用
Sep 11 Python
python中将一个全部为int的list 转化为str的list方法
Apr 09 Python
python pands实现execl转csv 并修改csv指定列的方法
Dec 12 Python
解决webdriver.Chrome()报错:Message:'chromedriver' executable needs to be in Path
Jun 12 Python
python pytest进阶之xunit fixture详解
Jun 27 Python
centos 安装Python3 及对应的pip教程详解
Jun 28 Python
sklearn-SVC实现与类参数详解
Dec 10 Python
keras实现VGG16 CIFAR10数据集方式
Jul 07 Python
深入解析NumPy中的Broadcasting广播机制
May 30 Python
如何用python绘制雷达图
两行代码解决Jupyter Notebook中文不能显示的问题
python基础详解之if循环语句
Apr 24 #Python
解决jupyter notebook图片显示模糊和保存清晰图片的操作
Jupyter notebook 输出部分显示不全的解决方案
Apr 24 #Python
Python opencv缺陷检测的实现及问题解决
解决jupyter notebook启动后没有token的坑
You might like
浅析Yii2缓存的使用
2016/05/10 PHP
Thinkphp3.2简单解决多文件上传只上传一张的问题
2017/09/26 PHP
PHP addAttribute()函数讲解
2019/02/03 PHP
php写入mysql中文乱码的实例解决方法
2019/09/17 PHP
jquery入门—数据删除与隔行变色以及图片预览
2013/01/07 Javascript
jquery中交替点击事件的实现代码
2014/02/14 Javascript
JS实现一个列表中包含上移下移删除等功能
2014/09/24 Javascript
JavaScript实现点击按钮直接打印
2016/01/06 Javascript
AngularJS入门教程之AngularJS模型
2016/04/18 Javascript
Bootstrap登陆注册页面开发教程
2016/07/12 Javascript
js图片轮播插件的封装
2017/07/21 Javascript
使用mint-ui实现省市区三级联动效果的示例代码
2018/02/09 Javascript
react 实现页面代码分割、按需加载的方法
2018/04/03 Javascript
深入浅析var,let,const的异同点
2018/08/07 Javascript
JS+HTML5实现获取手机验证码倒计时按钮
2018/08/08 Javascript
element上传组件循环引用及简单时间倒计时的实现
2018/10/01 Javascript
JavaScript剩余操作符Rest Operator详解
2019/07/20 Javascript
过滤器vue.filters的使用方法实现
2019/09/18 Javascript
代码块高亮可复制显示js插件highlight.js+clipboard.js整合
2021/02/15 Javascript
[01:52]2014DOTA2西雅图邀请赛 V社开大会你不知道的小秘密
2014/07/08 DOTA
python 读取目录下csv文件并绘制曲线v111的方法
2018/07/06 Python
Python静态类型检查新工具之pyright 使用指南
2019/04/26 Python
实例详解Python装饰器与闭包
2019/07/29 Python
简单了解Python3 bytes和str类型的区别和联系
2019/12/19 Python
pytorch 实现打印模型的参数值
2019/12/30 Python
基于python3.7利用Motor来异步读写Mongodb提高效率(推荐)
2020/04/29 Python
pycharm 实现光标快速移动到括号外或行尾的操作
2021/02/05 Python
35款精致的 CSS3 和 HTML5 网页模板 推荐
2012/08/03 HTML / CSS
HTML5 canvas基本绘图之绘制曲线
2016/06/27 HTML / CSS
美国嘻哈文化生活方式品牌:GLD
2018/04/15 全球购物
校运会广播稿100字
2014/01/27 职场文书
党员教师四风问题对照检查材料
2014/09/26 职场文书
2014年公务员工作总结
2014/11/18 职场文书
海洋天堂观后感
2015/06/05 职场文书
新闻发布会新闻稿
2015/07/17 职场文书
python+opencv实现目标跟踪过程
2022/06/21 Python