Python办公20:图片格式转换——Webp/PNG/JPG 批量互转及无损压缩

发布时间:2026/11/1 23:54:28

Python办公20:图片格式转换——Webp/PNG/JPG 批量互转及无损压缩 20图片格式转换——Webp/PNG/JPG 批量互转及无损压缩第三阶段PDF 与图片处理16-22场景引入网站需要 WebP 格式的图片以提升加载速度客户要求 JPG 格式方便查看系统只接受 PNG 格式的图标图片太大需要压缩后发送手动用画图工具一张一张转换太慢了。本节用 Python 实现批量格式转换和压缩。技术原理Pillow 支持几乎所有常见图片格式读取图片任意格式 → PIL Image 对象 → 保存为指定格式格式特点适用场景JPG/JPEG有损压缩不支持透明照片、产品图PNG无损压缩支持透明图标、截图WebPGoogle 格式体积小网页图片BMP无压缩老系统兼容TIFF无损支持多层印刷、存档环境准备pipinstallPillow完整代码importosfrompathlibimportPathfromPILimportImage# 支持的图片格式SUPPORTED_EXTENSIONS{.jpg,.jpeg,.png,.webp,.bmp,.tiff,.gif}# 方案 1单个格式转换 defconvert_image(input_file,output_formatjpg,quality85,max_sizeNone): 转换图片格式 参数: input_file: 输入图片路径 output_format: 输出格式 jpg/png/webp/bmp quality: 压缩质量1-100仅对 jpg/webp 有效 max_size: 最大尺寸 (width, height) 或 None input_pathPath(input_file)imgImage.open(input_path)# 如果需要调整大小ifmax_size:img.thumbnail(max_size,Image.LANCZOS)# 处理 RGBA → RGBJPG 不支持透明通道ifoutput_formatin(jpg,jpeg,bmp)andimg.modeRGBA:# 白色背景替代透明backgroundImage.new(RGB,img.size,(255,255,255))background.paste(img,maskimg.split()[3])imgbackground# 生成输出文件名output_fileinput_path.with_suffix(f.{output_format})# 保存参数save_kwargs{}ifoutput_formatin(jpg,jpeg):save_kwargs{quality:quality,optimize:True}elifoutput_formatwebp:save_kwargs{quality:quality,method:6}elifoutput_formatpng:save_kwargs{optimize:True}img.save(output_file,**save_kwargs)# 打印对比original_sizeinput_path.stat().st_size new_sizeoutput_file.stat().st_size ratio(1-new_size/original_size)*100print(f{input_path.name}({original_size/1024:.1f}KB) → f{output_file.name}({new_size/1024:.1f}KB) f[{ifratio0else-}{abs(ratio):.1f}%])returnoutput_file# 方案 2批量转换 defbatch_convert_folder(input_dir,output_dir,output_formatjpg,quality85): 批量转换文件夹中的所有图片 input_pathPath(input_dir)output_pathPath(output_dir)output_path.mkdir(parentsTrue,exist_okTrue)count0total_saved0forfile_pathininput_path.iterdir():iffile_path.is_file()andfile_path.suffix.lower()inSUPPORTED_EXTENSIONS:output_fileoutput_path/f{file_path.stem}.{output_format}imgImage.open(file_path)original_sizefile_path.stat().st_size# 处理 RGBA → RGBifoutput_formatin(jpg,jpeg,bmp)andimg.modeRGBA:backgroundImage.new(RGB,img.size,(255,255,255))background.paste(img,maskimg.split()[3])imgbackground save_kwargs{}ifoutput_formatin(jpg,jpeg):save_kwargs{quality:quality,optimize:True}elifoutput_formatwebp:save_kwargs{quality:quality,method:6}img.save(output_file,**save_kwargs)new_sizeoutput_file.stat().st_size total_savedoriginal_size-new_size count1print(f\n批量转换完成:{count}张图片)print(f节省空间:{total_saved/1024/1024:.2f}MB)# 方案 3批量压缩不改变格式 defbatch_compress_images(input_dir,output_dir,quality75,max_width1920,max_height1080): 批量压缩图片保持原格式降低质量和尺寸 input_pathPath(input_dir)output_pathPath(output_dir)output_path.mkdir(parentsTrue,exist_okTrue)count0total_saved0forfile_pathininput_path.iterdir():iffile_path.is_file()andfile_path.suffix.lower()in{.jpg,.jpeg,.png,.webp}:imgImage.open(file_path)# 缩小尺寸ifmax_widthandmax_height:img.thumbnail((max_width,max_height),Image.LANCZOS)save_kwargs{}iffile_path.suffix.lower()in(.jpg,.jpeg):save_kwargs{quality:quality,optimize:True}output_fileoutput_path/file_path.name img.save(output_file,**save_kwargs)original_sizefile_path.stat().st_size new_sizeoutput_file.stat().st_size total_savedoriginal_size-new_size count1print(f批量压缩完成:{count}张图片)print(f节省空间:{total_saved/1024/1024:.2f}MB)# 使用示例 if__name____main__:# 单个转换# convert_image(photo.png, output_formatjpg, quality85)# 批量转 WebP网页优化batch_convert_folder(产品图片,产品图片_WebP,output_formatwebp,quality80)# 批量压缩# batch_compress_images(原始照片, 压缩照片, quality75, max_width1920)常见问题Q1GIF 动图转换后不动了Pillow默认只读取 GIF 的第一帧。如需保留动画使用imageiopipinstallimageioimportimageio framesimageio.mimread(animation.gif)imageio.mimwrite(output.webp,frames,duration0.1)Q2JPG 转 PNG 后体积变大很多JPG 是有损压缩PNG 是无损压缩。JPG → PNG 会放大原本被压缩的信息。建议反向转换PNG → JPG来减小体积。总结操作方法效果格式转换img.save(output.jpg)自动转换压缩质量quality75降低文件大小缩小尺寸img.thumbnail()等比例缩放透明处理RGBA → RGBJPG 兼容本节掌握了图片格式批量转换和压缩的能力。下一节预告21表格提取——从 PDF 扫描件中自动抓取表格数据至 Excel
延伸阅读

更多相关文章

2026/11/2 2:55:47

网络模型面试全攻略:从TCP/IP分层到三次握手与HTTP

在牛客刷面经的时候,“网络模型”四个字几乎每隔几条就会出现一次。这个标签底下的真实内容,其实是大家在面试中遇到的一大串问题:OSI七层还是TCP/IP四层、TCP三次握手四次挥手、HTTP和HTTPS、粘包拆包、从输入URL到页面展示。很多人以为把它…

2026/10/31 11:14:21

前端接口怎样约定减少返工

前端接口怎样约定减少返工 接口返工常从一个小变化开始:字段改名、空值范围扩大、时间单位没有写清,或者页面直接依赖了数据库实体。减少返工不等于让接口永远不变,而是让变化有版本、有校验、有明确的适配位置。前后端围绕同一份契约讨论&am…

2026/10/31 11:15:45

非科班转AI,论文都读不懂的我,靠5个偷师习惯把业务提效了30%

非科班转AI,论文都读不懂的我,靠5个偷师习惯把业务提效了30% 去年夏天,老板把商品推荐模块交到我手上,我以为不过是写几个接口的事。翻开第一篇协同过滤论文,满屏的矩阵分解符号直接把我打回原形。那两周我试了各种速成法,直到在 AWS 官网上撞见人工智能入门--这门课第一节课就…

2026/11/2 3:39:59

Python AI学习路线:从零基础到上手大模型应用开发

经常有刚入行的朋友问我一个特别实际的问题:想学AI,编程底子薄,到底从哪起步?市面上的教程多得像迷宫,今天让你学爬虫,明天推你啃数据结构,一个星期下来连个Hello World都没跑利索。说实话&…

2026/11/2 3:39:59

紫微斗数排盘软件V3.0部署:运行库、区域设置与排盘口径验证

简介:易排盘紫微斗数V3.0是一款面向紫微斗数爱好者与命理研究者的PC Windows排盘软件,免费免注册,解压后即可运行,适合需要反复起盘、整理命例或开展专题研究的使用者。它支持阳历、阴历、四柱三种输入方式,可选真太阳…

2026/11/2 3:39:59

AI交易实战:六大模型各1万美元实盘炒币六周,结果意外

超正式但多为废话的AI评测,我看得有点腻了。真正让我感兴趣的问题是:当这些模型被扔进一个充满博弈、情绪和高频波动的真实市场,它们靠一张嘴输出观点是一回事,让它们真金白银去下单,又是另外一回事。去年底我搭了一个…

2026/11/2 3:39:59

国产VLM OCR模型横评:四款落地级视觉语言OCR实战指南

1. 项目概述:为什么四款国产VLM OCR模型值得被认真对待最近两周,我连续接到三类咨询:一类是政务系统集成商在做“无纸化审批”改造时卡在了扫描件表格识别上,原用Tesseract对带边框的财政票据识别率跌到62%;一类是制造…

2026/11/2 3:34:59

Swift类型转换详解:从基础到高级实践

1. Swift类型转换概述在Swift开发中,类型转换是处理不同类型数据交互的核心技术。与Objective-C的动态特性不同,Swift作为强类型语言,其类型系统在编译时就能捕获大多数类型不匹配的错误。这种设计虽然提高了代码安全性,但也使得类…

2026/11/1 0:01:26

面向复杂光照与角度的宠物面部识别鲁棒性增强策略

在智慧养宠时代,基于视觉的宠物身份识别技术正逐步从实验室走向家庭应用。然而,与配合度高的人类不同,宠物是典型的“非合作生物识别对象”——它们不会主动配合摄像头调整姿态,更无法控制光照环境。实际应用中,我们常…

2026/11/1 1:01:33

SSM电子书店源码全解析:结构、原理、部署与排错实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/11/2 1:04:04

工业级SPI隔离设计:硬件抗扰与信号完整性实战指南

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/11/2 1:04:04

PLFM_RADAR:主动探测数据通道,构建低误报的数据感知系统

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/11/2 1:04:04

工业SPI隔离设计:MAX14431与STM32F746硬件抗干扰实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/11/1 0:01:26

面向复杂光照与角度的宠物面部识别鲁棒性增强策略

在智慧养宠时代,基于视觉的宠物身份识别技术正逐步从实验室走向家庭应用。然而,与配合度高的人类不同,宠物是典型的“非合作生物识别对象”——它们不会主动配合摄像头调整姿态,更无法控制光照环境。实际应用中,我们常…

2026/11/1 1:01:33

SSM电子书店源码全解析:结构、原理、部署与排错实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

还想了解更多?直接咨询顾问

免费诊断 + 免费方案 + 透明报价。

全国咨询热线400-8866-253
免费获取方案
☎咨询二维码 ☎ ↑