PYTHON 自动化办公:压缩图片(PIL)

1、介绍

在办公还是学习过程中,难免会遇到上传照片的问题。然而照片的大小限制一直都是个问题,例如照片限制在200Kb之内,虽然有很多图像压缩技术可以实现,但从图像处理的专业来说,可以利用代码实现

这里使用的库函数是python的PIL库(Pillow),pillow安装命令如下

pip install pillow

这里使用PIL.Image.save()方法内部使用压缩算法对图片进行的压缩处理。

form PIL import Image
img = Image.open("demo.jpg")
img.save(img_name, quality=95)

quality参数: 保存图像的质量,值的范围从1(最差)到95(最佳), 默认值为75。

值如果高于100,会禁用部分JPEG压缩算法,并导致大文件图像质量几乎没有任何增益。

提示:subsampling参数:子采样,通过实现色度信息的分辨率低于亮度信息来对图像进行编码的实践。可以配合quality使用,具体实现可以自己上网查询

2、压缩单张图片

代码如下:因为保存需要文件名,不同的图片后缀啊、名称啊各不相同,这里简单提供了一个,也可以直接在img.save 里面自己指定

from PIL import Image


def main(img_path):
    ret_path = img_path.split('.jpg')[0]        # .jpg 根据后缀更改
    ret_path = ret_path + '_result.jpg'         # 返回的图片名

    img = Image.open(img_path)
    img.save(ret_path,quality=15)


if __name__ == '__main__':
    root = 'test.jpg'         # 传入图片的路径
    main(img_path=root)

效果展示:

一般quailty 值放到30-45就差不多了,图片质量看不出啥区别

3、多张图片压缩(单个文件夹)

如果压缩多张图片的话,直接把图片放在同一个文件夹目录下即可

这里的测试代码(demo.py)测试文件夹(demo)在同一级路径,或者指定路径也行

代码差不多,这里不介绍,直接展示了:

这里会返回新的目录,不会改变图片的文件名或者后置

如果不满意压缩结果,这样多次运行程序,会自动将之前的结果替换

from PIL import Image
import os
from tqdm import tqdm


def main(folder_path):
    ret_folder_path = folder_path + '_ret'              # 返回父目录
    if not os.path.exists(ret_folder_path):             # 建立目录
        os.makedirs(ret_folder_path)

    img_path= [i for i in os.listdir(folder_path)]      # 所有图片路径

    for i in tqdm(img_path):
        img = os.path.join(folder_path,i)
        img = Image.open(img)                   # 打开图片
        img.save(os.path.join(ret_folder_path,i),quality=15)


if __name__ == '__main__':
    root = './demo'             # 多个图片的父目录
    main(folder_path=root)

运行过程:

结果:

这里的图片肉眼看不出区别,就不展示了

4、 多个文件夹的图片压缩

如果有多个文件夹,每个文件夹下都有图片的话,可以新建个父目录,将所有文件夹放进去

代码类似的,这里直接展示:

这里会返回新的目录,不会改变子文件夹的名称或者图片的名称和后缀

如果不满意压缩结果,需要将返回的父目录删除,否则会报错!!!

from PIL import Image
import os
from tqdm import tqdm


def main(folder_path):
    ret_folder_path = folder_path + '_ret'  # 返回父目录
    if not os.path.exists(ret_folder_path):  # 建立目录
        os.makedirs(ret_folder_path)

    sub_folder_path= [i for i in os.listdir(folder_path)]       # 次级目录
    for i in sub_folder_path:           # 遍历次级目录
        os.makedirs(os.path.join(ret_folder_path,i))    # 建立子目录
        for j in tqdm(os.listdir(os.path.join(folder_path,i)),desc=i):       # 遍历当前次级目录的所有图片
            img_path = os.path.join(folder_path,i,j)            # 图片路径
            img = Image.open(img_path)
            img.save(os.path.join(ret_folder_path,i,j),quality=15)


if __name__ == '__main__':
    root = './demo'             # 父目录
    main(folder_path=root)

运行过程:

结果:

压缩的图片和之前的看不出啥区别,就不展示了

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/423802.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【Redis知识点总结】(一)——各种数据结构及其应用场景

Redis知识点总结(一)——基础数据类型及其应用场景 基础数据类型基础数据类介绍底层数据结构SDS(简单动态字符串)list(双向链表)ziplist(压缩列表)quicklist(快速表&…

Unity3D学习之Lua热更新解决方案(二)XLua

文章目录 1 XLua概述2 xLua导入和AB包相关准备3 C#调用Lua3.1 Lua解析器3.2 文件加载重定向3.3 Lua解析器管理器3.3.1 重定向AB包内的Lua3.3.2 获得_G大表 3.4 全局变量的获取3.5 全局函数的获取3.5.1 无参无返回3.5.2 有参有返回3.5.3 多返回值3.5.4 变长参数 3.6 List和Dicti…

策略模式 详解 设计模式

策略模式 策略模式是一种行为型设计模式,它定义了一系列算法,将每个算法封装到具有共同接口的独立类中,并且使它们可以相互替换。 策略模式可以让算法的变化独立于使用算法的客户端。 主要解决: 在有多种算法相似的情况下&#…

Linux系统管理:虚拟机 Kali Linux 安装

目录 一、理论 1.Kali Linux 二、实验 1.虚拟机Kali Linux安装准备阶段 2.安装Kali Linux 2. Kali Linux 更换国内源 3. Kali Linux 设置固定IP 4. Kali Linux 开启SSH远程连接 5. MobaXterm远程连接 Kali Linux 三、问题 1.apt 命令 取代哪些 apt-get命令 一、理论…

Linux文本处理三剑客:awk

在Linux操作系统中,grep、sed、awk被称为文本操作“三剑客”,上两期中,我们将详细介绍grep、sed的基本使用方法,希望能够帮助到有需要的朋友,现在,我们继续学习awk。 虽然awk是一个Linux中常见的命令&…

C 嵌入式系统设计模式 17:静态优先级模式

本书的原著为:《Design Patterns for Embedded Systems in C ——An Embedded Software Engineering Toolkit 》,讲解的是嵌入式系统设计模式,是一本不可多得的好书。 本系列描述我对书中内容的理解。本文章描述嵌入式并发和资源管理模式之三…

Slicer学习笔记(六十五) 3DSlicer的医学图像数据增强扩展模块

1. 医学图像数据增强扩展模块 基于3D Slicer5.1.0 编写了一个测试医学图像的数据增强测试扩展模块。 扩展模块名:DataAugementation 项目地址:DataAugmentation 下载该项目后,可以将该扩展模块添加到3D Slicer的扩展中。 关于如何给3DSlicer…

【STA】多场景时序检查学习记录

单周期路径 建立时间时序检查 在时钟的有效沿到达触发器之前,数据应在一定时间内保持稳定,这段时间即触发器的建立 时间。满足建立时间要求将确保数据可靠地被捕获到触发器中。 建立时间检查是从发起触发器中时钟的第一个有效沿到捕获触发器中时钟后面…

萌新学习RSA第一天

文章来自NSSCTF工坊Xenny的课程 1.非对称加密 2.介绍RSA来源(三位数学家名字开头) 3.RSA数学基础 4.算法实现 from Crypto.Util.number import * #这个是关于RSA很多函数的库 p getPrime(512) #111RSA第一步:生成随机的51…

Sora学习(一):Sora技术路径整体认知

前文:最近跟着DataWhale组队学习这一期“Sora原理与技术实战”,本篇博客主要是基于DataWhale成员、厦门大学平潭研究院杨知铮研究员分享的Sora技术原理详解课件内容以及参考网上一些博客资料整理而来(详见文末参考文献)&#xff0…

鸿蒙Harmony应用开发—ArkTS声明式开发(通用属性:禁用控制)

组件是否可交互,可交互状态下响应点击事件、触摸事件、拖拽事件、按键事件、焦点事件和鼠标事件。 说明: 从API Version 7开始支持。后续版本如有新增内容,则采用上角标单独标记该内容的起始版本。 enabled enabled(value: boolean) 设置组…

持续集成(CICD)- Git版本管理工具,Gitee线上仓库

文章目录 一、学习目标:二、什么是Git工具三 、Git环境搭建(windows系统)四、Gitee设置(私钥和公钥绑定)五、Git结合Gittee进行基本设置(重要)六、在Gitee上新建仓库私有仓库(非空仓库)七、Git拉取线上仓库代码,提交代码(重要)八、Git解决版本冲突问题(重要)场景一…

第二讲:用geth和以太坊交互

一:安装geth brew install ethereum geth github网址: https://github.com/ethereum/go-ethereum 二: 用geth连接以太坊 以太坊有主网络(Ethereum Mainnet),有测试网络(Sepolia、Goerli 等等…

leetcode 热题 100_盛最多水的容器

题解一: 双指针遍历:容量计算公式为min(左高度,右高度)*底部距离,我们可以令底部距离逐步递减(左右两边的指针向中部移动)。此时对于min(左高度,右高度),假设较高的线向中部移动&…

如何修炼成“神医”——《OceanBase诊断系列》之一

本系列是基于OcenaBase 开发工程师在工作中的一些诊断经验,也欢迎大家分享相关经验。 1. 关于神医的故事 扁鹊,中国古代第一个被正史记载的医生,他的成才之路非常传奇。年轻时,扁鹊是一家客栈的主管。有一位名叫长桑君的客人来到…

HTTPS的实现原理

图片来源:HTTPS 详解一:附带最精美详尽的 HTTPS 原理图 - 个人文章 - SegmentFault 思否 加密流程按图中的序号分为: 客户端请求 HTTPS 网址,然后连接到 server 的 443 端口 (HTTPS 默认端口,类似于 HTTP 的80端口)。…

小程序和页面生命周期详解

目录 小程序的生命周期 创建(onLoad): 显示(onShow): 隐藏(onHide): 卸载(onUnload): 错误监听(onError)…

使用最新Hal库实现USART中断收发功能(STM32F4xx)

目录 概述 1 认识STM32F4XX的USART 1.1 USART 功能说明 1.2 USART的中断 1.3 USART 模式配置 1.4 USART的寄存器 2 使用STM32CubeMX 生成工程 2.1 配置参数 2.2 生成工程代码 3 实现软件功能 3.1 软件功能介绍 3.2 认识USART Hal库 3.2.1 初始化函数组 3.2.2 发送…

66-ES6:var,let,const,函数的声明方式,函数参数,剩余函数,延展操作符,严格模式

1.JavaScript语言的执行流程 编译阶段:构建执行函数;执行阶段:代码依次执行 2.代码块:{ } 3.变量声明方式var 有声明提升,允许重复声明,声明函数级作用域 访问:声明后访问都是正常的&…

殿堂级Flink源码极精课程预售

一、为什么我们要读源码? 1、让个人技术快速成长: 优秀的开源框架,底层的源码设计思想也非常优秀,同时还有含有大量的设计模式和并发编程技术,优秀的解决方案,熟读源码对猿们技术提升有很大帮助 2、新技术学习能力: Java开源码框架的源码熟读后,若出现…