svg格式的文件没法直接丢到训练集,所以先转为jpg。代码如下:
#!/user/bin/env python3
# -*- coding: utf-8 -*-
import svglib.svglib as svg
from PIL import Image
from reportlab.graphics import renderPDF
import cairosvg
import os
def svg_to_pdf():
drawing = svg.svg2rlg("/data/projects/Florence-2-large/svg_test_data/s-47.svg")
pdf_file = "output.pdf"
renderPDF.drawToFile(drawing, pdf_file) # 将svg转为pdf文件
def svg_to_jpg(folder_path):
for root, dirs, files in os.walk(folder_path):
for file in files:
if not file.endswith(".svg"):
continue
file_path = os.path.join(root, file)
png_file = os.path.join(root, f"{file.split('.')[0]}.png")
jpg_file = os.path.join(root, f"{file.split('.')[0]}.jpg")
cairosvg.svg2png(url=file_path, write_to=png_file) # 读取并渲染为png
image = Image.open(png_file) # 转为图像对象
# 因为背景是透明的,先转为白色背景
background = Image.new("RGB", image.size, (255, 255, 255)) # 创建一个白色背景,尺寸和原图一致
background.paste(image, mask=image.split()[-1]) # 将原图贴到白色背景上,保持透明度不变
# 还可以指定宽度或高度,调整图像大小
# if width or height:
# image = image.resize((width, height))
background.save(jpg_file, "JPEG") # 保存为jpg格式
if __name__ == '__main__':
folder_path = "/data/svg_test_data"
svg_to_jpg(folder_path)
批量的方法很简单,就用os.walk遍历即可。