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中操作字典之update()方法的使用
May 22 Python
Python编程实战之Oracle数据库操作示例
Jun 21 Python
详谈python3中用for循环删除列表中元素的坑
Apr 19 Python
Windows系统下PhantomJS的安装和基本用法
Oct 21 Python
Ubuntu下Python2与Python3的共存问题
Oct 31 Python
对python 多线程中的守护线程与join的用法详解
Feb 18 Python
PyQt4 treewidget 选择改变颜色,并设置可编辑的方法
Jun 17 Python
华为2019校招笔试题之处理字符串(python版)
Jun 25 Python
python实现银行管理系统
Oct 25 Python
Python偏函数Partial function使用方法实例详解
Jun 17 Python
python UIAutomator2使用超详细教程
Feb 19 Python
使用Selenium实现微博爬虫(预登录、展开全文、翻页)
Apr 13 Python
如何用python绘制雷达图
两行代码解决Jupyter Notebook中文不能显示的问题
python基础详解之if循环语句
Apr 24 #Python
解决jupyter notebook图片显示模糊和保存清晰图片的操作
Jupyter notebook 输出部分显示不全的解决方案
Apr 24 #Python
Python opencv缺陷检测的实现及问题解决
解决jupyter notebook启动后没有token的坑
You might like
打造计数器DIY三步曲(下)
2006/10/09 PHP
两种设置php载入页面时编码的方法
2014/07/29 PHP
PHP7正式版测试,性能惊艳!
2015/12/08 PHP
php实现基于pdo的事务处理方法示例
2017/07/21 PHP
dojo 之基础篇(三)之向服务器发送数据
2007/03/24 Javascript
ExtJs的Date格式字符代码
2010/12/30 Javascript
jQuery+CSS 半开折叠效果原理及代码(自写)
2013/03/04 Javascript
解决jquery操作checkbox火狐下第二次无法勾选问题
2014/02/10 Javascript
JS兼容浏览器的导出Excel(CSV)文件的方法
2014/05/03 Javascript
引用其它js时如何同时处理多个window.onload事件
2014/09/02 Javascript
node.js中的fs.unlinkSync方法使用说明
2014/12/15 Javascript
Vue-cli-webpack搭建斗鱼直播步骤详解
2017/11/17 Javascript
Vue实现带进度条的文件拖动上传功能
2018/02/23 Javascript
JavaScript Array对象基本方法详解
2019/09/03 Javascript
layer.confirm点击第一个按钮关闭弹出框的方法
2019/09/09 Javascript
jQuery 选择器用法实例分析【prev + next】
2020/05/22 jQuery
vue项目中企业微信使用js-sdk时config和agentConfig配置方式详解
2020/12/15 Vue.js
浅析Python中的多条件排序实现
2016/06/07 Python
Scrapy基于selenium结合爬取淘宝的实例讲解
2018/06/13 Python
Ubuntu下升级 python3.7.1流程备忘(推荐)
2018/12/10 Python
使用Python实现跳帧截取视频帧
2019/05/31 Python
一行Python代码过滤标点符号等特殊字符
2019/08/12 Python
Python lambda表达式filter、map、reduce函数用法解析
2019/09/11 Python
python内置模块collections知识点总结
2019/12/19 Python
tensorflow之变量初始化(tf.Variable)使用详解
2020/02/06 Python
win10安装python3.6的常见问题
2020/07/01 Python
Europcar德国:全球汽车租赁领域的领导者
2018/08/15 全球购物
模具专业推荐信
2013/10/30 职场文书
饭店工作计划书
2014/01/10 职场文书
旅游文化节策划方案
2014/06/06 职场文书
企业安全标语
2014/06/07 职场文书
暑期教师培训方案
2014/06/07 职场文书
班主任工作经验交流会总结
2015/11/02 职场文书
倡议书怎么写?
2019/04/11 职场文书
正则表达式拆分url实例代码
2022/02/24 Java/Android
MySQL限制查询和数据排序介绍
2022/03/25 MySQL