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抓取Discuz!用户名脚本代码
Dec 30 Python
在Python中使用CasperJS获取JS渲染生成的HTML内容的教程
Apr 09 Python
用Python一键搭建Http服务器的方法
Jun 01 Python
解决python3捕获cx_oracle抛出的异常错误问题
Oct 18 Python
python的等深分箱实例
Nov 22 Python
Django 解决上传文件时,request.FILES为空的问题
May 20 Python
python3+openCV 获取图片中文本区域的最小外接矩形实例
Jun 02 Python
使用OpenCV对车道进行实时检测的实现示例代码
Jun 19 Python
Keras 数据增强ImageDataGenerator多输入多输出实例
Jul 03 Python
使用Python实现微信拍一拍功能的思路代码
Jul 09 Python
Python在线和离线安装第三方库的方法
Oct 31 Python
python中的测试框架
Nov 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
新手配置 PHP 调试环境(IIS+PHP+MYSQL)
2007/01/10 PHP
php 攻击方法之谈php+mysql注射语句构造
2009/10/30 PHP
php添加数据到xml文件的简单例子
2016/09/08 PHP
利用phpexcel对数据库数据的导入excel(excel筛选)、导出excel
2017/04/27 PHP
js类中的公有变量和私有变量
2008/07/24 Javascript
jquery解决图片路径不存在执行替换路径
2013/02/06 Javascript
JavaScript实现复制功能各浏览器支持情况实测
2013/07/18 Javascript
简洁Ajax函数处理(示例代码)
2013/11/15 Javascript
node.js中的emitter.on方法使用说明
2014/12/10 Javascript
javascript实现网页屏蔽Backspace事件,输入框不屏蔽
2015/07/21 Javascript
JS实现的通用表单验证插件完整实例
2015/08/20 Javascript
js实现创建删除html元素小结
2015/09/30 Javascript
Express实现前端后端通信上传图片之存储数据库(mysql)傻瓜式教程(二)
2015/12/10 Javascript
javascript中利用柯里化函数实现bind方法
2016/04/29 Javascript
jQuery基于BootStrap样式实现无限极地区联动
2016/08/26 Javascript
js导出excel文件的简洁方法(推荐)
2016/11/02 Javascript
基于MVC方式实现三级联动(JavaScript)
2017/01/23 Javascript
vue router路由嵌套不显示问题的解决方法
2017/06/17 Javascript
[js高手之路]从原型链开始图解继承到组合继承的产生详解
2017/08/28 Javascript
React如何利用相对于根目录进行引用组件详解
2017/10/09 Javascript
vue移动端下拉刷新和上拉加载的实现代码
2018/09/08 Javascript
微信小程序webview实现长按点击识别二维码功能示例
2019/01/24 Javascript
vant组件中 dialog的确认按钮的回调事件操作
2020/11/04 Javascript
Python实现发送与接收邮件的方法详解
2018/03/28 Python
Python request使用方法及问题总结
2020/04/26 Python
pycharm 激活码及使用方式的详细教程
2020/05/12 Python
使用python实现名片管理系统
2020/06/18 Python
20行代码教你用python给证件照换底色的方法示例
2021/02/05 Python
西班牙香水和化妆品网上商店:Douglas
2017/10/29 全球购物
暑期研修感言
2014/02/17 职场文书
餐饮投资计划书
2014/04/25 职场文书
高一新生军训方案
2014/05/12 职场文书
博物馆观后感
2015/06/05 职场文书
婚庆主持词大全
2015/06/30 职场文书
体育教师研修感悟
2015/11/18 职场文书
Java并发编程之Executor接口的使用
2021/06/21 Java/Android