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 输出一个两行字符的变量
Feb 05 Python
python使用PythonMagick将jpg图片转换成ico图片的方法
Mar 26 Python
在Linux系统上部署Apache+Python+Django+MySQL环境
Dec 24 Python
关于Tensorflow中的tf.train.batch函数的使用
Apr 24 Python
python selenium 对浏览器标签页进行关闭和切换的方法
May 21 Python
python邮件发送smtplib使用详解
Jun 16 Python
opencv导入头文件时报错#include的解决方法
Jul 31 Python
python datetime中strptime用法详解
Aug 29 Python
解决tensorflow打印tensor有省略号的问题
Feb 04 Python
Python 读取有公式cell的结果内容实例方法
Feb 17 Python
selenium3.0+python之环境搭建的方法步骤
Feb 01 Python
在pyCharm中下载第三方库的方法
Apr 18 Python
如何用python绘制雷达图
两行代码解决Jupyter Notebook中文不能显示的问题
python基础详解之if循环语句
Apr 24 #Python
解决jupyter notebook图片显示模糊和保存清晰图片的操作
Jupyter notebook 输出部分显示不全的解决方案
Apr 24 #Python
Python opencv缺陷检测的实现及问题解决
解决jupyter notebook启动后没有token的坑
You might like
中国的第一台收音机
2021/03/01 无线电
深入PHP magic quotes的详解
2013/06/17 PHP
discuz加密解密函数使用方法和中文注释
2014/01/21 PHP
简述php环境搭建与配置
2016/12/05 PHP
PHP基于自定义函数实现的汉字转拼音功能实例
2017/09/30 PHP
Javascript 个人笔记(没有整理,很乱)
2007/07/07 Javascript
lib.utf.js
2007/08/21 Javascript
JavaScript constructor和instanceof,JSOO中的一对欢喜冤家
2009/05/25 Javascript
jQuery 下拉列表 二级联动插件分享
2012/03/29 Javascript
jQuery实现首页图片淡入淡出效果的方法
2015/06/10 Javascript
包含中国城市的javascript对象实例
2015/08/03 Javascript
JavaScript实现自动弹出窗口并自动关闭窗口的方法
2015/08/06 Javascript
JS中call/apply、arguments、undefined/null方法详解
2016/02/15 Javascript
前端开发之CSS原理详解
2017/03/11 Javascript
jquery在vue脚手架中的使用方式示例
2017/08/29 jQuery
vue.js vue-router如何实现无效路由(404)的友好提示
2017/12/20 Javascript
使用socket.io实现简单聊天室案例
2018/01/02 Javascript
使用Vue实现图片上传的三种方式
2018/07/17 Javascript
react build 后打包发布总结
2018/08/24 Javascript
在Vant的基础上封装下拉日期控件的代码示例
2018/12/05 Javascript
微信小程序 云开发模糊查询实现解析
2019/09/02 Javascript
解决Layui 表格自适应高度的问题
2019/11/15 Javascript
vue中的使用token的方法示例
2020/03/10 Javascript
用Angular实现一个扫雷的游戏示例
2020/05/15 Javascript
Python使用matplotlib绘图无法显示中文问题的解决方法
2018/03/14 Python
python list转置和前后反转的例子
2019/08/26 Python
Python如何使用turtle库绘制图形
2020/02/26 Python
英国最大的宠物商店:Pets at Home
2019/04/17 全球购物
物业管理毕业生个人的求职信
2013/11/30 职场文书
办公室助理岗位职责
2013/12/25 职场文书
商场主管竞聘书
2014/03/31 职场文书
社区两委对照检查材料
2014/08/23 职场文书
2015年世界无烟日演讲稿
2015/03/18 职场文书
go语言使用Casbin实现角色的权限控制
2021/06/26 Golang
python神经网络学习 使用Keras进行简单分类
2022/05/04 Python
使用Nginx+Tomcat实现负载均衡的全过程
2022/05/30 Servers