在日常开发中图片格式转换是一个高频需求——上传前压缩体积、适配不同平台的格式要求、生成缩略图……手动一张张改不存在的。Python 几行代码就能搞定。本文覆盖主流转换场景提供可直接运行的代码拿来就能用。一、先搞清楚常见图片格式有哪些格式特点典型场景JPG/JPEG有损压缩体积小不支持透明照片、网页配图PNG无损压缩支持透明通道图标、截图、需要透明背景的图GIF支持动画256色表情包、简单动画WebPGoogle 出品体积比 JPG 小 30%网站优化Chrome 全面支持BMP无压缩体积巨大几乎不用仅特殊场景TIFF高质量多用于印刷专业摄影、印刷核心结论大部分场景只需要在 JPG、PNG、WebP 三者之间转换。二、工具选型用哪个库库适用场景优点缺点PillowPIL通用转换最推荐简单、稳定、文档全大批量时稍慢OpenCVcv2需要同时做图像处理功能强大依赖多安装重imageio读写 GIF/WebP 动画动画支持好依赖 ffmpegPillow-SIMD追求速度比 Pillow 快 2-4 倍需要单独安装90% 的场景用 Pillow 就够了。安装pipinstallPillow三、基础转换一行代码搞定1. PNG → JPGfromPILimportImage imgImage.open(input.png)# PNG 有透明通道JPG 不支持必须转 RGBrgb_imgimg.convert(RGB)rgb_img.save(output.jpg,quality95)⚠️关键坑PNG 转 JPG 必须先.convert(RGB)否则报错或出黑底。2. JPG → PNGfromPILimportImage imgImage.open(input.jpg)img.save(output.png)这个不用特殊处理直接转。3. 任意格式 → WebP推荐用于网页fromPILimportImage imgImage.open(input.png)img.save(output.webp,quality80)WebP 的quality参数范围 0-10080 是体积和质量的 sweet spot。四、批量转换一个文件夹全搞定这才是真实需求。一次性转换整个目录importosfromPILimportImagedefbatch_convert(input_dir,output_dir,target_formatjpg,quality90): 批量转换图片格式 :param input_dir: 输入目录 :param output_dir: 输出目录 :param target_format: 目标格式jpg/png/webp :param quality: JPG/WebP 质量1-100 os.makedirs(output_dir,exist_okTrue)supported{.jpg,.jpeg,.png,.bmp,.gif,.webp,.tiff}forfilenameinos.listdir(input_dir):ifnotany(filename.lower().endswith(ext)forextinsupported):continueinput_pathos.path.join(input_dir,filename)name,_os.path.splitext(filename)output_pathos.path.join(output_dir,f{name}.{target_format})try:withImage.open(input_path)asimg:# 处理透明通道iftarget_formatin(jpg,jpeg):imgimg.convert(RGB)eliftarget_formatwebp:imgimg.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_formatwebp,quality80)五、进阶转换时顺便压缩很多时候转换格式就是为了减小体积。直接在转换时控制fromPILimportImagedefcompress_and_convert(input_path,output_path,target_formatjpg,max_size(800,800)):转换格式 限制尺寸 压缩质量withImage.open(input_path)asimg:# 限制最大尺寸保持比例img.thumbnail(max_size,Image.LANCZOS)iftarget_formatin(jpg,jpeg):imgimg.convert(RGB)img.save(output_path,quality75,optimizeTrue)eliftarget_formatwebp:img.save(output_path,quality75,method6)# method6 是最高压缩else:img.save(output_path)compress_and_convert(photo.png,photo_small.webp)optimizeTrue和method6能让 JPG/WebP 再小 10-20%强烈建议加上。六、GIF 动画转换GIF 稍微特殊一点需要逐帧处理fromPILimportImagedefgif_to_frames(gif_path,output_dir):把 GIF 拆成 PNG 帧os.makedirs(output_dir,exist_okTrue)imgImage.open(gif_path)fori,frameinenumerate(ImageSequence.Iterator(img)):frame.save(os.path.join(output_dir,fframe_{i:03d}.png))defframes_to_gif(frames_dir,output_gif,duration100):把 PNG 帧合成 GIFduration 单位毫秒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_allTrue,append_imagesframes[1:],durationduration,loop0)七、性能对比Pillow vs Pillow-SIMD场景PillowPillow-SIMD单张转换~50ms~20ms1000 张 JPG→WebP~45s~15s如果你要处理上万张图装 Pillow-SIMDpip uninstall Pillow pipinstallPillow-SIMD代码完全一样直接替换不用改任何逻辑。八、选型决策树需要转格式 ├── 单纯转格式 → Pillow ├── 还要裁剪/加水印/滤镜 → OpenCV ├── GIF 动画处理 → imageio 或 Pillow ├── 批量 1000 张 → Pillow-SIMD └── Web 优化为主 → Pillow 转 WebPquality80总结需求推荐方案单张快速转换Image.open().save()批量转换文件夹上面的batch_convert()函数网页图片优化转 WebPquality80optimizeTruePNG 转 JPG必须先.convert(RGB)追求速度Pillow-SIMD图片转换这件事Python 能做到的远不止格式互转——压缩、缩放、加水印都能一把梭。先把格式转换这一步打通后面的处理就是加几行代码的事。有具体场景拿不准的可以把需求丢过来直接帮你写代码。
Python 图片格式转换完全指南:从入门到批量处理
发布时间:2026/6/22 2:35:47
在日常开发中图片格式转换是一个高频需求——上传前压缩体积、适配不同平台的格式要求、生成缩略图……手动一张张改不存在的。Python 几行代码就能搞定。本文覆盖主流转换场景提供可直接运行的代码拿来就能用。一、先搞清楚常见图片格式有哪些格式特点典型场景JPG/JPEG有损压缩体积小不支持透明照片、网页配图PNG无损压缩支持透明通道图标、截图、需要透明背景的图GIF支持动画256色表情包、简单动画WebPGoogle 出品体积比 JPG 小 30%网站优化Chrome 全面支持BMP无压缩体积巨大几乎不用仅特殊场景TIFF高质量多用于印刷专业摄影、印刷核心结论大部分场景只需要在 JPG、PNG、WebP 三者之间转换。二、工具选型用哪个库库适用场景优点缺点PillowPIL通用转换最推荐简单、稳定、文档全大批量时稍慢OpenCVcv2需要同时做图像处理功能强大依赖多安装重imageio读写 GIF/WebP 动画动画支持好依赖 ffmpegPillow-SIMD追求速度比 Pillow 快 2-4 倍需要单独安装90% 的场景用 Pillow 就够了。安装pipinstallPillow三、基础转换一行代码搞定1. PNG → JPGfromPILimportImage imgImage.open(input.png)# PNG 有透明通道JPG 不支持必须转 RGBrgb_imgimg.convert(RGB)rgb_img.save(output.jpg,quality95)⚠️关键坑PNG 转 JPG 必须先.convert(RGB)否则报错或出黑底。2. JPG → PNGfromPILimportImage imgImage.open(input.jpg)img.save(output.png)这个不用特殊处理直接转。3. 任意格式 → WebP推荐用于网页fromPILimportImage imgImage.open(input.png)img.save(output.webp,quality80)WebP 的quality参数范围 0-10080 是体积和质量的 sweet spot。四、批量转换一个文件夹全搞定这才是真实需求。一次性转换整个目录importosfromPILimportImagedefbatch_convert(input_dir,output_dir,target_formatjpg,quality90): 批量转换图片格式 :param input_dir: 输入目录 :param output_dir: 输出目录 :param target_format: 目标格式jpg/png/webp :param quality: JPG/WebP 质量1-100 os.makedirs(output_dir,exist_okTrue)supported{.jpg,.jpeg,.png,.bmp,.gif,.webp,.tiff}forfilenameinos.listdir(input_dir):ifnotany(filename.lower().endswith(ext)forextinsupported):continueinput_pathos.path.join(input_dir,filename)name,_os.path.splitext(filename)output_pathos.path.join(output_dir,f{name}.{target_format})try:withImage.open(input_path)asimg:# 处理透明通道iftarget_formatin(jpg,jpeg):imgimg.convert(RGB)eliftarget_formatwebp:imgimg.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_formatwebp,quality80)五、进阶转换时顺便压缩很多时候转换格式就是为了减小体积。直接在转换时控制fromPILimportImagedefcompress_and_convert(input_path,output_path,target_formatjpg,max_size(800,800)):转换格式 限制尺寸 压缩质量withImage.open(input_path)asimg:# 限制最大尺寸保持比例img.thumbnail(max_size,Image.LANCZOS)iftarget_formatin(jpg,jpeg):imgimg.convert(RGB)img.save(output_path,quality75,optimizeTrue)eliftarget_formatwebp:img.save(output_path,quality75,method6)# method6 是最高压缩else:img.save(output_path)compress_and_convert(photo.png,photo_small.webp)optimizeTrue和method6能让 JPG/WebP 再小 10-20%强烈建议加上。六、GIF 动画转换GIF 稍微特殊一点需要逐帧处理fromPILimportImagedefgif_to_frames(gif_path,output_dir):把 GIF 拆成 PNG 帧os.makedirs(output_dir,exist_okTrue)imgImage.open(gif_path)fori,frameinenumerate(ImageSequence.Iterator(img)):frame.save(os.path.join(output_dir,fframe_{i:03d}.png))defframes_to_gif(frames_dir,output_gif,duration100):把 PNG 帧合成 GIFduration 单位毫秒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_allTrue,append_imagesframes[1:],durationduration,loop0)七、性能对比Pillow vs Pillow-SIMD场景PillowPillow-SIMD单张转换~50ms~20ms1000 张 JPG→WebP~45s~15s如果你要处理上万张图装 Pillow-SIMDpip uninstall Pillow pipinstallPillow-SIMD代码完全一样直接替换不用改任何逻辑。八、选型决策树需要转格式 ├── 单纯转格式 → Pillow ├── 还要裁剪/加水印/滤镜 → OpenCV ├── GIF 动画处理 → imageio 或 Pillow ├── 批量 1000 张 → Pillow-SIMD └── Web 优化为主 → Pillow 转 WebPquality80总结需求推荐方案单张快速转换Image.open().save()批量转换文件夹上面的batch_convert()函数网页图片优化转 WebPquality80optimizeTruePNG 转 JPG必须先.convert(RGB)追求速度Pillow-SIMD图片转换这件事Python 能做到的远不止格式互转——压缩、缩放、加水印都能一把梭。先把格式转换这一步打通后面的处理就是加几行代码的事。有具体场景拿不准的可以把需求丢过来直接帮你写代码。