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操作MySQL简单实现方法
Jan 26 Python
简单讲解Python中的字符串与字符串的输入输出
Mar 13 Python
python获取当前用户的主目录路径方法(推荐)
Jan 12 Python
python利用正则表达式搜索单词示例代码
Sep 24 Python
python中通过预先编译正则表达式提高效率
Sep 25 Python
Python使用Phantomjs截屏网页的方法
May 17 Python
python使用多进程的实例详解
Sep 19 Python
使用python将最新的测试报告以附件的形式发到指定邮箱
Sep 20 Python
django formset实现数据表的批量操作的示例代码
Dec 06 Python
Python如何获取Win7,Win10系统缩放大小
Jan 10 Python
Python识别html主要文本框过程解析
Feb 18 Python
python简单利用字典破解zip文件口令
Sep 07 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中如何使对象可以像数组一样进行foreach循环
2013/08/09 PHP
使用php的HTTP请求的库Requests实现美女图片墙
2015/02/22 PHP
Zend Framework教程之配置文件application.ini解析
2016/03/10 PHP
php实现计算百度地图坐标之间距离的方法
2016/05/05 PHP
thinkPHP5.0框架简单配置作用域的方法
2017/03/17 PHP
document.documentElement和document.body区别介绍
2013/09/16 Javascript
如何在父窗口中得知window.open()出的子窗口关闭事件
2013/10/15 Javascript
Flexigrid在IE下不显示数据的处理的解决方法
2013/10/24 Javascript
javascript删除option选项的多种方法总结
2013/11/22 Javascript
JS去掉第一个字符和最后一个字符的实现代码
2014/02/20 Javascript
Javascript表单验证要注意的事项
2014/09/29 Javascript
AngularJS iframe跨域打开内容时报错误的解决办法
2015/01/26 Javascript
angularJS提交表单(form)
2015/02/09 Javascript
jQuery实现自动调整字体大小的方法
2015/06/15 Javascript
ES6新特性之函数的扩展实例详解
2017/04/01 Javascript
详解Vue-cli 创建的项目如何跨域请求
2017/05/18 Javascript
angularJs使用$watch和$filter过滤器制作搜索筛选实例
2017/06/01 Javascript
vue如何从接口请求数据
2017/06/22 Javascript
vue mintui-Loadmore结合实现下拉刷新和上拉加载示例
2017/10/12 Javascript
解决Angular.js中使用Swiper插件不能滑动的问题
2018/02/26 Javascript
用vue写一个仿简书的轮播图的示例代码
2018/03/13 Javascript
原生JS与CSS实现软件卸载对话框功能
2019/12/05 Javascript
JavaScript事件概念详解(区分静态注册和动态注册)
2021/02/05 Javascript
[00:47]DOTA2荣耀之路6:玩不了啦!
2018/05/30 DOTA
Python2和Python3的共存和切换使用
2019/04/12 Python
Python中six模块基础用法
2019/12/08 Python
Pytorch高阶OP操作where,gather原理
2020/04/30 Python
浅谈matplotlib默认字体设置探索
2021/02/03 Python
selenium+python自动化78-autoit参数化与批量上传功能的实现
2021/03/04 Python
html5是什么_动力节点Java学院整理
2017/07/07 HTML / CSS
美国一站式电动和手动工具商店:International Tool
2020/11/26 全球购物
Athleta官网:购买女士瑜伽服、技术运动服和休闲运动服
2020/11/12 全球购物
化工工艺设计求职信
2014/06/25 职场文书
校园安全教育心得体会
2016/01/15 职场文书
小学生反邪教心得体会
2016/01/15 职场文书
《雪地里的小画家》教学反思
2016/02/16 职场文书