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爬虫常用的模块分析
Aug 29 Python
python处理图片之PIL模块简单使用方法
May 11 Python
5种Python单例模式的实现方式
Jan 14 Python
Python中跳台阶、变态跳台阶与矩形覆盖问题的解决方法
May 19 Python
Django中数据库的数据关系:一对一,一对多,多对多
Oct 21 Python
解决Python 命令行执行脚本时,提示导入的包找不到的问题
Jan 19 Python
pygame实现俄罗斯方块游戏(AI篇2)
Oct 29 Python
python3 使用Opencv打开USB摄像头,配置1080P分辨率的操作
Dec 11 Python
python numpy 矩阵堆叠实例
Jan 17 Python
python实现二分类和多分类的ROC曲线教程
Jun 15 Python
微信小程序调用python模型
Apr 21 Python
pd.DataFrame中的几种索引变换的实现
Jun 16 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中使用灵巧的体系结构
2006/10/09 PHP
javascript html 静态页面传参数
2009/04/10 Javascript
Mootools 1.2教程 类(一)
2009/09/15 Javascript
jQuery 打造动态下滑菜单实现说明
2010/04/15 Javascript
JavaScript中OnLoad几种使用方法
2012/12/15 Javascript
由ReactJS的Hello world说开来
2015/07/02 Javascript
Bootstrap多级导航栏(级联导航)的实现代码
2016/03/08 Javascript
CSS3 media queries结合jQuery实现响应式导航
2016/09/30 Javascript
js querySelector() 使用方法
2016/12/21 Javascript
基于require.js的使用(实例讲解)
2017/09/07 Javascript
React全家桶环境搭建过程详解
2018/05/18 Javascript
vue中element-ui表格缩略图悬浮放大功能的实例代码
2018/06/26 Javascript
分享5个顶级的JavaScript Ajax组件库
2018/09/16 Javascript
写gulp遇到的ES6问题详解
2018/12/03 Javascript
微信小程序实现提交input信息到后台的方法示例
2019/01/19 Javascript
[14:57]DOTA2 HEROS教学视频教你分分钟做大人-幽鬼
2014/06/13 DOTA
[44:40]2018DOTA2亚洲邀请赛3月30日 小组赛A组Liquid VS OG
2018/03/31 DOTA
Python中的pprint折腾记
2015/01/21 Python
python爬取m3u8连接的视频
2018/02/28 Python
Python将多个list合并为1个list的方法
2018/06/27 Python
python对html过滤处理的方法
2018/10/21 Python
python 应用之Pycharm 新建模板默认添加编码格式-作者-时间等信息【推荐】
2019/06/17 Python
django 中QuerySet特性功能详解
2019/07/25 Python
python实现删除列表中某个元素的3种方法
2020/01/15 Python
Python API len函数操作过程解析
2020/03/05 Python
ivx平台开发之不用代码实现一个九宫格抽奖功能
2021/01/27 HTML / CSS
Myprotein加拿大官网:欧洲第一的运动营养品牌
2018/01/06 全球购物
2019年Java 最常见的 面试题
2016/10/19 面试题
常用UNIX 命令(Linux的常用命令)
2013/07/10 面试题
体育教师工作总结的自我评价
2013/10/10 职场文书
大三在校生电子商务求职信
2013/10/29 职场文书
校园文化建设方案
2014/02/03 职场文书
高考励志标语
2014/06/05 职场文书
节水标语大全
2014/06/11 职场文书
婚宴主持词
2015/06/30 职场文书
陶瓷类经典广告语集锦
2019/10/25 职场文书