现场是这样的。Pillow 10.4,把带透明通道的 PNG 批量转 JPEG,报 cannot write mode RGBA as JPEG,脚本跑到一半中断,已转的文件正常。
中间走过弯路,把「保存时没指定 quality,默认参数不兼容」当成主因,改完现象没变。
排查方向其实有限,先把可能性排一排。RGBA 有四个通道,JPEG 只支持三通道;转换前没有合成背景色;文件后缀写 jpg 但内容仍是 PNG。
上来先看图片的实际模式
python -c "from PIL import Image;print(Image.open('a.png').mode)"
再往下合成白底再存 JPEG
python -c "from PIL import Image;im=Image.open('a.png').convert('RGBA');bg=Image.new('RGB',im.size,(255,255,255));bg.paste(im,mask=im.split()[3]);bg.save('a.jpg',quality=88)"
接着确认输出模式是 RGB
python -c "from PIL import Image;print(Image.open('a.jpg').mode)"
批量统计转换结果
python -c "import glob;print(len(glob.glob('out/*.jpg')))"
这台环境是别人交接的,不少默认值被动过,只能一项项核。
同事提醒我看一下最近一次发布,时间点确实对得上。
命令输出我都留了记录,免得改完记不清原来的值。
别只看报错消失,验证要多做一步。所有图片都转成 RGB 模式的 JPEG,透明区域变白,抽查尺寸与原图一致。
格式转换的报错都很直白,缺的是转换前的模式归一,批量任务里要加一层兜底。拖得越久,排查成本越高,因为现场状态会被后续操作覆盖。
