PNG转JPG:什么时候转,什么时候别转
·
3 min read
·
Imagic AI Team
PNG和JPG是不同的格式,有不同的用途。告诉你什么时候该转,什么时候不该转,以及怎么转才对。
PNG转JPG:什么时候转,什么时候别转
PNG和JPG是完全不同的东西。
什么时候转,什么时候别转,说清楚。
先搞清楚区别
| 特性 | PNG | JPG |
|---|---|---|
| 压缩方式 | 无损 | 有损 |
| 透明支持 | ✅ 有 | ❌ 没有 |
| 照片大小 | 大 | 小 |
| 图形大小 | 小 | 大 |
| 画质 | 完全保真 | 每次保存都丢一点 |
| 适合 | 图形、截图 | 照片 |
PNG - 保存什么就是什么,不会丢画质。适合有透明背景的东西。
JPG - 会压缩,文件小。适合照片。
该转的情况
✅ 照片是PNG格式
如果你的照片莫名其妙存成了PNG,转成JPG能省不少空间。
from PIL import Image
# 打开PNG
img = Image.open('photo.png')
# PNG可能有透明通道,要处理一下
if img.mode == 'RGBA':
# 给照片加个白色背景
background = Image.new('RGB', img.size, (255, 255, 255))
background.paste(img, mask=img.split()[3])
img = background
elif img.mode != 'RGB':
img = img.convert('RGB')
# 保存JPG
img.save('photo.jpg', 'JPEG', quality=90)
✅ 大批量照片存档
RAW转成PNG,然后又想发网上?直接转JPG就行。
不该转的情况
❌ 有透明背景
PNG有透明通道,JPG没有。
问题: 转成JPG后,透明部分变成黑色或者白色。
解决: 保持PNG,或者转成WebP(也支持透明)。
❌ 截图/带文字的图
截图用PNG是因为文字边缘清晰。JPG压缩会糊掉文字。
例子:
- PNG截图:280KB,文字锐利
- JPG截图:95KB,文字发虚
解决: 保持PNG,或者无损WebP。
❌ 图形、logo
线条清晰的图形,JPG压缩会产生杂色边缘。
解决: 保持PNG,或者用SVG(矢量图)。
实际测试数据
照片
| 格式 | 文件大小 | 画质 |
|---|---|---|
| PNG | 2.1MB | 完美 |
| JPG 90% | 185KB | 完美 |
| JPG 80% | 95KB | 还好 |
| WebP 80% | 85KB | 完美 |
结论: 照片转JPG,90%质量就行。
截图(带文字)
| 格式 | 文件大小 | 文字清晰度 |
|---|---|---|
| PNG | 280KB | 完美 |
| JPG 90% | 95KB | 勉强能看 |
| JPG 80% | 55KB | 糊了 |
| WebP无损 | 85KB | 完美 |
结论: 截图别用JPG,用PNG或无损WebP。
Logo(有透明背景)
| 格式 | 文件大小 | 透明效果 |
|---|---|---|
| PNG | 45KB | ✅ 完美 |
| JPG(白色背景) | 35KB | ❌ 白底 |
| WebP有损 | 22KB | ✅ 完美 |
| WebP无损 | 28KB | ✅ 完美 |
结论: 要透明就用PNG或WebP,别用JPG。
快速决策
图有透明背景吗?
├─ 有 → 别转JPG,用PNG或WebP
└─ 没有
├─ 是照片吗?
│ ├─ 是 → JPG或WebP
│ └─ 不是
│ ├─ 有文字/图形吗?
│ │ ├─ 是 → PNG或WebP
│ │ └─ 不是 → JPG或WebP
转换脚本
基本转换
from PIL import Image
from pathlib import Path
def png_to_jpg(input_path, output_path, quality=90):
img = Image.open(input_path)
# 处理透明
if img.mode == 'RGBA':
# 照片加白底
background = Image.new('RGB', img.size, (255, 255, 255))
background.paste(img, mask=img.split()[3])
img = background
elif img.mode != 'RGB':
img = img.convert('RGB')
# 保存
img.save(output_path, 'JPEG', quality=quality, optimize=True)
# 打印结果
import os
orig = os.path.getsize(input_path) / 1024
new = os.path.getsize(output_path) / 1024
print(f"{Path(input_path).name}: {orig:.0f}KB → {new:.0f}KB")
# 用法
png_to_jpg('image.png', 'image.jpg', quality=90)
批量转换
from PIL import Image
from pathlib import Path
from concurrent.futures import ThreadPoolExecutor
def batch_png_to_jpg(input_dir, output_dir, quality=90, workers=4):
input_path = Path(input_dir)
output_path = Path(output_dir)
output_path.mkdir(exist_ok=True)
png_files = list(input_path.glob('*.png'))
print(f"转换 {len(png_files)} 个PNG文件...")
def convert(png):
try:
img = Image.open(png)
if img.mode == 'RGBA':
background = Image.new('RGB', img.size, (255, 255, 255))
background.paste(img, mask=img.split()[3])
img = background
elif img.mode != 'RGB':
img = img.convert('RGB')
output = output_path / f"{png.stem}.jpg"
img.save(output, 'JPEG', quality=quality, optimize=True)
return png.name, True
except Exception as e:
return png.name, False
with ThreadPoolExecutor(max_workers=workers) as executor:
results = list(executor.map(convert, png_files))
success = sum(1 for _, ok in results if ok)
print(f"成功: {success}/{len(png_files)}")
# 用法
batch_png_to_jpg('./png_files', './jpg_files', quality=90)
常见问题
Q: 转JPG会损失画质吗?
A: 一点点。PNG是无损的,JPG是有损的。90%质量下,肉眼基本看不出区别。
Q: 该不该转?
A: 照片、没有透明和文字的图片可以转。其他的别转。
Q: WebP比JPG好吗?
A: 是的。小30%左右,画质一样。但JPG兼容性更好。
Q: 怎么知道图有没有透明?
from PIL import Image
def has_transparency(img):
if img.mode == 'RGBA':
return img.split()[3].getextrema()[0] < 255
return False
img = Image.open('image.png')
if has_transparency(img):
print("有透明!别转JPG")
总结
- 照片没透明 → JPG或WebP - 省空间
- 有透明 → PNG或WebP - JPG不支持透明
- 截图/文字 → PNG或WebP - JPG压画像素
- 网页图片 → WebP - 比JPG和PNG都小
- 转之前检查透明 - 不然白底/黑底
快速工具
Imagic AI - PNG转JPG,一键搞定
转了10000+张图了。有问题留言。