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处理html转义字符的方法详解
Jul 01 Python
TensorFlow实现随机训练和批量训练的方法
Apr 28 Python
利用python的socket发送http(s)请求方法示例
May 07 Python
python实现键盘控制鼠标移动
Nov 27 Python
python虚拟环境迁移方法
Jan 03 Python
Python匿名函数及应用示例
Apr 09 Python
Python实现二叉树前序、中序、后序及层次遍历示例代码
May 18 Python
Python使用itchat 功能分析微信好友性别和位置
Aug 05 Python
Django 自定义404 500等错误页面的实现
Mar 08 Python
python矩阵运算,转置,逆运算,共轭矩阵实例
May 11 Python
Python小白不正确的使用类变量实例
May 29 Python
Pytorch如何切换 cpu和gpu的使用详解
Mar 01 Python
如何用python绘制雷达图
两行代码解决Jupyter Notebook中文不能显示的问题
python基础详解之if循环语句
Apr 24 #Python
解决jupyter notebook图片显示模糊和保存清晰图片的操作
Jupyter notebook 输出部分显示不全的解决方案
Apr 24 #Python
Python opencv缺陷检测的实现及问题解决
解决jupyter notebook启动后没有token的坑
You might like
URL Rewrite的设置方法
2007/01/02 PHP
php获得文件夹下所有文件的递归算法的简单实例
2016/11/01 PHP
用javascript实现在小方框中浏览大图的代码
2007/08/14 Javascript
JavaScript Object的extend是一个常用的功能
2009/12/02 Javascript
javascript XMLHttpRequest对象全面剖析
2010/04/24 Javascript
jQuery的实现原理的模拟代码 -1 核心部分
2010/08/01 Javascript
JS小功能(操作Table--动态添加删除表格及数据)实现代码
2013/11/28 Javascript
JavaScript中使用Callback控制流程介绍
2015/03/16 Javascript
JQ技术实现注册页面带有校验密码强度
2015/07/27 Javascript
jQuery使用$.ajax进行异步刷新的方法(附demo下载)
2015/12/04 Javascript
用原生js统计文本行数的简单示例
2016/08/19 Javascript
详解nodeJS中读写文件方法的区别
2017/03/06 NodeJs
Jquery中attr与prop的区别详解
2017/05/27 jQuery
ES6中箭头函数的定义与调用方式详解
2017/06/02 Javascript
理解javascript async的用法
2017/08/22 Javascript
微信小程序实现多宫格抽奖活动
2020/04/15 Javascript
ES6 Iterator接口和for...of循环用法分析
2019/07/31 Javascript
layui加载数据显示loading加载完成loading消失的实例代码
2019/09/23 Javascript
vue 根据选择的月份动态展示日期对应的星期几
2021/02/06 Vue.js
python实现电子产品商店
2019/02/26 Python
Django前后端分离csrf token获取方式
2020/12/25 Python
python 将Excel转Word的示例
2021/03/02 Python
时尚的CSS3进度条效果
2012/02/22 HTML / CSS
西班牙香水和化妆品连锁店:Druni
2019/05/05 全球购物
Marc O’Polo俄罗斯官方在线商店:德国高端时尚品牌
2019/12/26 全球购物
设计4个线程,其中两个线程每次对j增加1,另外两个线程对j每次减少1。写出程序。
2014/12/30 面试题
小学生家长评语集锦
2014/01/30 职场文书
吃空饷专项治理工作实施方案
2014/03/04 职场文书
实习单位评语
2014/04/26 职场文书
幼儿园教师师德师风演讲稿:我自豪我是一名幼师
2014/09/10 职场文书
纪念九一八事变演讲稿:青少年应树立远大理想
2014/09/14 职场文书
教师工作失职检讨书
2014/09/18 职场文书
小学优秀教师先进事迹材料
2014/12/16 职场文书
初中班长竞选稿
2015/11/20 职场文书
少先队大队委竞选口号
2015/12/25 职场文书
AJAX实现省市县三级联动效果
2021/10/16 Javascript