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的Django框架中模板碎片缓存简介
Jul 24 Python
Python自定义进程池实例分析【生产者、消费者模型问题】
Sep 19 Python
Python使用progressbar模块实现的显示进度条功能
May 31 Python
对python 数据处理中的LabelEncoder 和 OneHotEncoder详解
Jul 11 Python
Python实现快速傅里叶变换的方法(FFT)
Jul 21 Python
python中退出多层循环的方法
Nov 27 Python
python 删除字符串中连续多个空格并保留一个的方法
Dec 22 Python
对django xadmin自定义菜单的实例详解
Jan 03 Python
Python读取csv文件分隔符设置方法
Jan 14 Python
利用ctypes获取numpy数组的指针方法
Feb 12 Python
Django框架教程之中间件MiddleWare浅析
Dec 29 Python
用Python爬虫破解滑动验证码的案例解析
May 06 Python
如何用python绘制雷达图
两行代码解决Jupyter Notebook中文不能显示的问题
python基础详解之if循环语句
Apr 24 #Python
解决jupyter notebook图片显示模糊和保存清晰图片的操作
Jupyter notebook 输出部分显示不全的解决方案
Apr 24 #Python
Python opencv缺陷检测的实现及问题解决
解决jupyter notebook启动后没有token的坑
You might like
PHP array_push 数组函数
2009/12/26 PHP
PHP 杂谈《重构-改善既有代码的设计》之五 简化函数调用
2012/05/07 PHP
基于PHP给大家讲解防刷票的一些技巧
2015/11/18 PHP
php获取网站根目录物理路径的几种方法(推荐)
2017/03/04 PHP
利用PHPStorm如何开发Laravel应用详解
2017/08/30 PHP
PHP htmlspecialchars_decode()函数用法讲解
2019/03/01 PHP
用PHP做了一个领取优惠券活动的示例代码
2019/07/05 PHP
EXTJS内使用ACTIVEX控件引起崩溃问题的解决方法
2010/03/31 Javascript
window.open以post方式将内容提交到新窗口
2012/12/26 Javascript
innerHTML,outerHTML,innerText,outerText的用法及区别解析
2013/12/16 Javascript
js获得参数的getParameter使用示例
2014/02/26 Javascript
JQuery以JSON方式提交数据到服务端示例代码
2014/05/05 Javascript
jquery引用方法时传递参数原理分析
2014/10/13 Javascript
JavaScript实现带标题的图片轮播特效
2015/05/20 Javascript
JavaScript实现in-place思想的快速排序方法
2016/08/07 Javascript
JavaScript SHA1加密算法实现详细代码
2016/10/06 Javascript
详解Vue取消eslint语法限制
2018/08/04 Javascript
解决Vue打包后访问图片/图标不显示的问题
2019/07/25 Javascript
vue 页面回退mounted函数不执行的解决方案
2020/07/26 Javascript
[03:15]DOTA2-DPC中国联赛1月22日Recap集锦
2021/03/11 DOTA
10款最好的Web开发的 Python 框架
2015/03/18 Python
Python使用metaclass实现Singleton模式的方法
2015/05/05 Python
TensorFlow实现随机训练和批量训练的方法
2018/04/28 Python
基于windows下pip安装python模块时报错总结
2018/06/12 Python
Python3 使用map()批量的转换数据类型,如str转float的实现
2019/11/29 Python
使用Python将Exception异常错误堆栈信息写入日志文件
2020/04/08 Python
python 实现分组求和与分组累加求和代码
2020/05/18 Python
Python 实现敏感目录扫描的示例代码
2020/05/21 Python
关于canvas.toDataURL 在iOS运行失败的问题解决
2020/09/16 HTML / CSS
Madda Fella官网:美国冒险家服装品牌
2020/01/16 全球购物
PHP使用Redis队列执行定时任务实例讲解
2021/03/24 PHP
个人简历自荐信
2013/12/05 职场文书
政法学院毕业生求职信
2014/02/28 职场文书
小学领导班子对照材料
2014/08/23 职场文书
六一文艺汇演开幕词
2015/01/29 职场文书
安全生产协议书
2016/03/22 职场文书