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 相关文章推荐
多线程爬虫批量下载pcgame图片url 保存为xml的实现代码
Jan 17 Python
Python3基础之函数用法
Aug 13 Python
Python中实现两个字典(dict)合并的方法
Sep 23 Python
详解Python编程中time模块的使用
Nov 20 Python
django_orm查询性能优化方法
Aug 20 Python
django+echart绘制曲线图的方法示例
Nov 26 Python
Python正则表达式匹配日期与时间的方法
Jul 07 Python
python列表插入append(), extend(), insert()用法详解
Sep 14 Python
python程序如何进行保存
Jul 03 Python
python 自定义异常和主动抛出异常(raise)的操作
Dec 11 Python
Python项目打包成二进制的方法
Dec 30 Python
python使用pycharm安装pyqt5以及相关配置
Apr 22 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笔记之:日期函数的使用介绍
2013/04/24 PHP
php 获取今日、昨日、上周、本月的起始时间戳和结束时间戳的方法
2013/09/28 PHP
只需20行代码就可以写出CSS覆盖率测试脚本
2013/04/24 Javascript
非常漂亮的JS+CSS图片幻灯切换特效
2013/11/20 Javascript
js处理表格对table进行修饰
2014/05/26 Javascript
PHP守护进程实例
2015/03/06 Javascript
JS实现可关闭的对联广告效果代码
2015/09/14 Javascript
js如何打印object对象
2015/10/16 Javascript
一不小心就做错的JS闭包面试题
2015/11/25 Javascript
对jQuary选择器的全面总结
2016/06/20 Javascript
AngularJS 单元测试(二)详解
2016/09/21 Javascript
JavaScript运动框架 解决速度正负取整问题(一)
2017/05/17 Javascript
js实现图片轮播效果学习笔记
2017/07/26 Javascript
浅谈VUE单页应用首屏加载速度优化方案
2018/08/28 Javascript
浅谈关于iview表单验证的问题
2018/09/29 Javascript
vue缓存的keepalive页面刷新数据的方法
2019/04/23 Javascript
JavaScript工具库MyTools详解
2020/01/01 Javascript
React 条件渲染最佳实践小结(7种)
2020/09/27 Javascript
go和python调用其它程序并得到程序输出
2014/02/10 Python
详解Python网络框架Django和Scrapy安装指南
2019/04/01 Python
pyqt5 实现在别的窗口弹出进度条
2019/06/18 Python
Python判断字符串是否为合法标示符操作
2020/09/03 Python
使用phonegap播放音频的实现方法
2017/03/31 HTML / CSS
Wedgwood美国官网:英国骨瓷,精美礼品及家居装饰
2018/02/17 全球购物
机电工程专业应届生求职信
2013/10/03 职场文书
班组长安全生产职责
2013/12/16 职场文书
《悯农》教学反思
2014/04/28 职场文书
给市场的环保建议书
2014/05/14 职场文书
团队精神口号
2014/06/06 职场文书
一年级语文下册复习计划
2015/01/17 职场文书
财务总监岗位职责范本
2015/04/03 职场文书
机修车间主任岗位职责
2015/04/08 职场文书
2015年个人工作总结报告
2015/04/25 职场文书
个人原因辞职信模板
2015/05/13 职场文书
鲁滨逊漂流记读书笔记
2015/06/26 职场文书
Golang实现可重入锁的示例代码
2022/05/25 Golang