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中将阿拉伯数字转换成中文的实现代码
May 19 Python
Linux下为不同版本python安装第三方库
Aug 31 Python
python实现机械分词之逆向最大匹配算法代码示例
Dec 13 Python
Python实现matplotlib显示中文的方法详解
Feb 06 Python
opencv改变imshow窗口大小,窗口位置的方法
Apr 02 Python
Python爬虫实现全国失信被执行人名单查询功能示例
May 03 Python
利用Python如何生成便签图片详解
Jul 09 Python
Python3 使用cookiejar管理cookie的方法
Dec 28 Python
5款Python程序员高频使用开发工具推荐
Apr 10 Python
python 两个数据库postgresql对比
Oct 21 Python
基于Python和PyYAML读取yaml配置文件数据
Jan 13 Python
python函数中将变量名转换成字符串实例
May 11 Python
如何用python绘制雷达图
两行代码解决Jupyter Notebook中文不能显示的问题
python基础详解之if循环语句
Apr 24 #Python
解决jupyter notebook图片显示模糊和保存清晰图片的操作
Jupyter notebook 输出部分显示不全的解决方案
Apr 24 #Python
Python opencv缺陷检测的实现及问题解决
解决jupyter notebook启动后没有token的坑
You might like
ThinkPHP3.2框架使用addAll()批量插入数据的方法
2017/03/16 PHP
Thinkphp 框架基础之入口文件功能、定义与用法分析
2020/04/27 PHP
Javascript 自定义类型方法小结
2010/03/02 Javascript
使用indexOf等在JavaScript的数组中进行元素查找和替换
2013/09/18 Javascript
javascript中函数作为参数调用的方法
2015/02/09 Javascript
javascript数组去重的方法汇总
2015/04/14 Javascript
javascript中CheckBox全选终极方案
2015/05/20 Javascript
Adapter适配器模式在JavaScript设计模式编程中的运用分析
2016/05/18 Javascript
Node.js如何响应Ajax的POST请求并且保存为JSON文件详解
2017/03/10 Javascript
Angular5.1新功能分享
2017/12/21 Javascript
vue2实现搜索结果中的搜索关键字高亮的代码
2018/08/29 Javascript
webpack4 SCSS提取和懒加载的示例
2018/09/03 Javascript
Webpack4 使用Babel处理ES6语法的方法示例
2019/03/07 Javascript
vuex存储复杂参数(如对象数组等)刷新数据丢失的解决方法
2019/11/05 Javascript
[00:59]DOTA2背景故事第二期之四大基本法则
2020/07/07 DOTA
Python多进程同步Lock、Semaphore、Event实例
2014/11/21 Python
使用Python的Twisted框架编写非阻塞程序的代码示例
2016/05/25 Python
Sanic框架应用部署方法详解
2018/07/18 Python
Python基于scipy实现信号滤波功能
2019/05/08 Python
Django认证系统实现的web页面实现代码
2019/08/12 Python
浅析pandas 数据结构中的DataFrame
2019/10/12 Python
python实现发送QQ邮件(可加附件)
2020/12/23 Python
使用CSS3实现input多选框自定义样式的方法示例
2019/07/19 HTML / CSS
html+css实现自定义图片上传按钮功能
2019/09/04 HTML / CSS
HTML5 通信API 跨域门槛将不再高、数据推送也不再是梦
2013/04/25 HTML / CSS
全球性的在线时尚男装零售商:boohooMAN
2016/12/17 全球购物
英国在线潜水商店:Simply Scuba
2019/03/25 全球购物
十岁生日同学答谢词
2014/01/19 职场文书
幼儿园中班教学反思
2014/02/10 职场文书
党员对照检查材料思想汇报
2014/09/16 职场文书
车间统计员岗位职责
2015/04/14 职场文书
活着观后感
2015/06/03 职场文书
2015年幼儿园师德师风建设工作总结
2015/10/23 职场文书
HR必备:销售经理聘用合同范本
2019/08/21 职场文书
导游词之淮安明祖陵
2019/11/25 职场文书
多表查询、事务、DCL
2021/04/05 MySQL