实现将PNG图片转换为JPG格式,并更新对应JSON文件中图片路径和图片数据,代码如下:
import os
import json
import base64
from PIL import Image
from io import BytesIO
def convert_png_to_jpg_and_update_json(input_folder):
"""
将文件夹中的PNG图片转换为JPG格式,并更新对应的JSON标注文件
:param input_folder: 包含PNG图片和JSON文件的文件夹路径
"""
# 遍历文件夹中的所有文件
for filename in os.listdir(input_folder):
if filename.lower().endswith('.png'):
png_path = os.path.join(input_folder, filename)
# 生成对应的JPG文件名和路径
jpg_filename = os.path.splitext(filename)[0] + '.jpg'
jpg_path = os.path.join(input_folder, jpg_filename)
# 生成对应的JSON文件名和路径
json_filename = os.path.splitext(filename)[0] + '.json'
json_path = os.path.join(input_folder, json_filename)
# 1. 转换图片格式 PNG -> JPG
try:
with Image.open(png_path) as img:
# 转换为RGB模式(去除Alpha通道)
if img.mode in ('RGBA', 'LA'):
background = Image.new('RGB', img.size, (255, 255, 255))
background.paste(img, mask=img.split()[-1])
img = background
elif img.mode != 'RGB':
img = img.convert('RGB')
# 保存为JPG
img.save(jpg_path, 'JPEG', quality=95)
print(f"转换成功: {filename} -> {jpg_filename}")
except Exception as e:
print(f"转换失败 {filename}: {str(e)}")
continue
# 2. 更新JSON文件(如果存在对应的JSON文件)
if os.path.exists(json_path):
try:
with open(json_path, 'r', encoding='utf-8') as f:
data = json.load(f)
# 更新图片路径
data['imagePath'] = jpg_filename
# 更新图片数据(可选)
if 'imageData' in data:
with open(jpg_path, 'rb') as img_file:
# 将新图片编码为base64
new_image_data = base64.b64encode(img_file.read()).decode('utf-8')
data['imageData'] = new_image_data
# 保存更新后的JSON
with open(json_path, 'w', encoding='utf-8') as f:
json.dump(data, f, indent=2)
print(f"更新成功: {json_filename}")
except Exception as e:
print(f"更新JSON失败 {json_filename}: {str(e)}")
else:
print(f"未找到对应的JSON文件: {json_filename}")
# 使用示例
if __name__ == "__main__":
target_folder = "/path/to/your/labelme/folder" # 替换为你的文件夹路径
convert_png_to_jpg_and_update_json(target_folder)
代码说明:
-
图片格式转换:
- 使用PIL库打开PNG图片
- 处理透明通道(RGBA模式转换为RGB)
- 保存为JPG格式(质量设置为95%)
-
JSON文件更新:
- 更新
imagePath
字段为新的JPG文件名 - 可选更新
imageData
字段(重新编码JPG图片为base64) - 保留JSON文件原有结构,只修改必要字段
- 更新
-
错误处理:
- 捕获并报告图片转换错误
- 捕获并报告JSON处理错误
- 跳过无对应JSON文件的图片
使用注意事项:
-
依赖安装:
pip install Pillow
-
透明通道处理:
- 透明区域会自动填充为白色背景
- 如果需要保留透明效果,需重新考虑转换方案(JPG不支持透明)
-
文件命名:
- 假设PNG和JSON文件具有相同的主文件名
- 例如:
image1.png
对应image1.json
-
图片质量:
- 当前设置为95%质量,可根据需要调整
quality
参数
- 当前设置为95%质量,可根据需要调整
-
原始文件:
- 代码不会删除原始PNG文件,如需清理请手动操作
- 原始JSON文件会被更新覆盖,建议提前备份
此代码完整实现了从PNG到JPG的转换,并保持LabelMe标注文件的同步更新,同时处理了图片格式转换中的常见问题。