当前位置: 首页 > news >正文

Python 图片格式转换完全指南:从入门到批量处理

在日常开发中,图片格式转换是一个高频需求——上传前压缩体积、适配不同平台的格式要求、生成缩略图……手动一张张改?不存在的。Python 几行代码就能搞定。

本文覆盖主流转换场景,提供可直接运行的代码,拿来就能用。


一、先搞清楚:常见图片格式有哪些?

格式特点典型场景
JPG/JPEG有损压缩,体积小,不支持透明照片、网页配图
PNG无损压缩,支持透明通道图标、截图、需要透明背景的图
GIF支持动画,256色表情包、简单动画
WebPGoogle 出品,体积比 JPG 小 30%+网站优化(Chrome 全面支持)
BMP无压缩,体积巨大几乎不用,仅特殊场景
TIFF高质量,多用于印刷专业摄影、印刷

核心结论:大部分场景只需要在 JPG、PNG、WebP 三者之间转换。


二、工具选型:用哪个库?

适用场景优点缺点
Pillow(PIL)通用转换,最推荐简单、稳定、文档全大批量时稍慢
OpenCV(cv2)需要同时做图像处理功能强大依赖多,安装重
imageio读写 GIF/WebP 动画动画支持好依赖 ffmpeg
Pillow-SIMD追求速度比 Pillow 快 2-4 倍需要单独安装

90% 的场景用 Pillow 就够了。

安装:

pipinstallPillow

三、基础转换:一行代码搞定

1. PNG → JPG

fromPILimportImage img=Image.open("input.png")# PNG 有透明通道,JPG 不支持,必须转 RGBrgb_img=img.convert("RGB")rgb_img.save("output.jpg",quality=95)

⚠️关键坑:PNG 转 JPG 必须先.convert("RGB"),否则报错或出黑底。

2. JPG → PNG

fromPILimportImage img=Image.open("input.jpg")img.save("output.png")

这个不用特殊处理,直接转。

3. 任意格式 → WebP(推荐用于网页)

fromPILimportImage img=Image.open("input.png")img.save("output.webp",quality=80)

WebP 的quality参数范围 0-100,80 是体积和质量的 sweet spot。


四、批量转换:一个文件夹全搞定

这才是真实需求。一次性转换整个目录:

importosfromPILimportImagedefbatch_convert(input_dir,output_dir,target_format="jpg",quality=90):""" 批量转换图片格式 :param input_dir: 输入目录 :param output_dir: 输出目录 :param target_format: 目标格式(jpg/png/webp) :param quality: JPG/WebP 质量(1-100) """os.makedirs(output_dir,exist_ok=True)supported={".jpg",".jpeg",".png",".bmp",".gif",".webp",".tiff"}forfilenameinos.listdir(input_dir):ifnotany(filename.lower().endswith(ext)forextinsupported):continueinput_path=os.path.join(input_dir,filename)name,_=os.path.splitext(filename)output_path=os.path.join(output_dir,f"{name}.{target_format}")try:withImage.open(input_path)asimg:# 处理透明通道iftarget_formatin("jpg","jpeg"):img=img.convert("RGB")eliftarget_format=="webp":img=img.convert("RGBA")# WebP 支持透明save_kwargs={"quality":quality}iftarget_formatin("jpg","webp")else{}img.save(output_path,**save_kwargs)print(f"✅{filename}{name}.{target_format}")exceptExceptionase:print(f"❌{filename}失败:{e}")# 使用batch_convert("./images","./converted",target_format="webp",quality=80)

五、进阶:转换时顺便压缩

很多时候转换格式就是为了减小体积。直接在转换时控制:

fromPILimportImagedefcompress_and_convert(input_path,output_path,target_format="jpg",max_size=(800,800)):"""转换格式 + 限制尺寸 + 压缩质量"""withImage.open(input_path)asimg:# 限制最大尺寸(保持比例)img.thumbnail(max_size,Image.LANCZOS)iftarget_formatin("jpg","jpeg"):img=img.convert("RGB")img.save(output_path,quality=75,optimize=True)eliftarget_format=="webp":img.save(output_path,quality=75,method=6)# method=6 是最高压缩else:img.save(output_path)compress_and_convert("photo.png","photo_small.webp")

optimize=Truemethod=6能让 JPG/WebP 再小 10-20%,强烈建议加上。


六、GIF 动画转换

GIF 稍微特殊一点,需要逐帧处理:

fromPILimportImagedefgif_to_frames(gif_path,output_dir):"""把 GIF 拆成 PNG 帧"""os.makedirs(output_dir,exist_ok=True)img=Image.open(gif_path)fori,frameinenumerate(ImageSequence.Iterator(img)):frame.save(os.path.join(output_dir,f"frame_{i:03d}.png"))defframes_to_gif(frames_dir,output_gif,duration=100):"""把 PNG 帧合成 GIF(duration 单位:毫秒)"""frames=[]forfinsorted(os.listdir(frames_dir)):iff.endswith(".png"):frames.append(Image.open(os.path.join(frames_dir,f)))frames[0].save(output_gif,save_all=True,append_images=frames[1:],duration=duration,loop=0)

七、性能对比:Pillow vs Pillow-SIMD

场景PillowPillow-SIMD
单张转换~50ms~20ms
1000 张 JPG→WebP~45s~15s

如果你要处理上万张图,装 Pillow-SIMD:

pip uninstall Pillow pipinstallPillow-SIMD

代码完全一样,直接替换,不用改任何逻辑。


八、选型决策树

需要转格式? ├── 单纯转格式 → Pillow ├── 还要裁剪/加水印/滤镜 → OpenCV ├── GIF 动画处理 → imageio 或 Pillow ├── 批量 > 1000 张 → Pillow-SIMD └── Web 优化为主 → Pillow 转 WebP,quality=80

总结

需求推荐方案
单张快速转换Image.open().save()
批量转换文件夹上面的batch_convert()函数
网页图片优化转 WebP,quality=80,optimize=True
PNG 转 JPG必须.convert("RGB")
追求速度Pillow-SIMD

图片转换这件事,Python 能做到的远不止格式互转——压缩、缩放、加水印都能一把梭。先把格式转换这一步打通,后面的处理就是加几行代码的事。

有具体场景拿不准的,可以把需求丢过来,直接帮你写代码。

http://www.jsqmd.com/news/1058663/

相关文章:

  • 基于YOLOv8与RexNet-150的两阶段深度学习考试作弊检测框架详解
  • SYCL异构编程实战:内存模型、并行抽象与跨平台性能深度解析
  • 讲真的2026年东莞知识产权诉讼律师 这5位值得选择推荐 - 本地品牌推荐
  • 基于CNN自编码器与MLP的象棋棋子动态价值预测模型构建与实战
  • 程序员生存指南12-技术再强不会沟通?AI时代程序员软技能生存指南,从“码农“到“技术领导者“:软技能决定你的天花板
  • 3D高斯泼溅隐写术:在神经渲染中实现高保真信息隐藏
  • Chatterbox开源TTS:情绪可控的语音合成新范式
  • 零基础也能制作专业歌词:LRC Maker终极指南
  • 广域空天布防·自愈闭环制胜|凌空全时侦控·虚实智能练兵
  • 2026年广州知识产权诉讼律师推荐怎么选?看这三点关键不踩雷 - 本地品牌推荐
  • CentOS 8 部署 MariaDB 实战:从初始化到等保合规
  • 2026年更新江门市电子料回收平台选型指南:为何佳邦灿电子回收备受企业青睐? - 品牌鉴赏官2026
  • Ultimate ASI Loader:3步实现游戏MOD革命性加载体验
  • 2026职业技能教育怎么选?重庆技工学校全解读 - 3158GEO
  • Python入门学习9:Python函数基础解析——从基础定义到灵活参数传递
  • 基于SiGe:C工艺的2.4GHz WiFi低噪声放大器设计与实战解析
  • Video2X:免费开源的视频AI增强终极指南,让模糊视频秒变高清4K
  • Ubuntu 18.04 部署 code-server:Nginx 反向代理 + HTTPS 完整实践
  • 基于Raft的区块链节点容错与扩展框架BlockRaFT设计实践
  • RAG隐私保护:匿名化时机对检索精度与数据安全的权衡
  • Ubuntu 16.04单机Hadoop本地模式实战:Java 8配置与WordCount验证
  • 如何在Inkscape中实现专业级光学设计:光线追踪扩展完全指南
  • 人工微型可控行星级拓扑飞行器系统可行性研究报告——基于自指螺旋拓扑与递归对抗动力学的技术落地论证(世毫九实验室前瞻研究)
  • LLM多语言礼貌策略差异实证:从数据到应用的全链路优化
  • 2026襄阳漏水检测维修本地口碑防水商家榜单:厨卫/阳台/屋面/地下室渗漏水维修,持证施工+明码实价,防水补漏公司TOP5推荐 - 即刻修防水
  • 数据流分析工具flowR:透视API驱动脚本的数据流动与调试
  • Ubuntu 18.04 快速部署 code-server 云 IDE(Nginx + Let‘s Encrypt)
  • 软件测试文档 留言板系统软件测试文档,留言板系统1(设计源文件+万字报告+讲解)(支持资料、图片参考_降重降ai)
  • Ruby on Rails 开发者必学:Docker Compose 容器化实战
  • GRIFT:基于梯度指纹的强化学习奖励黑客实时检测与抑制