如何结合PIL与CairoSVG使用SVG创建重复图案?
解决方法
核心思路是先把SVG代码转换成PIL可操作的图像对象,再通过循环将这个对象重复粘贴到主画布上,全程在内存中处理,不用先存成本地PNG文件。
步骤如下:
- 用
io.BytesIO接收CairoSVG转换后的SVG字节数据,避免写入本地文件 - 用PIL打开这个字节流,得到可复用的SVG图像对象
- 循环遍历目标位置,用
paste()方法把SVG图像粘贴到主画布
完整代码:
from cairosvg import svg2png from PIL import Image import io white = (255,255,255) # 创建主画布 img = Image.new('RGB', (300,300), white) svg_code = """ <svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="#000" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"> <circle cx="12" cy="12" r="10"/> <line x1="12" y1="8" x2="12" y2="12"/> <line x1="12" y1="16" x2="12" y2="16"/> </svg> """ # 将SVG代码转成PIL可读取的字节流 svg_bytes = svg2png(bytestring=svg_code) svg_img = Image.open(io.BytesIO(svg_bytes)).convert("RGBA") # 转成RGBA支持透明 # 循环生成重复图案,同时遍历x和y轴实现网格排列 for x in range(0, 300, 25): for y in range(0, 300, 25): # 粘贴SVG图像到指定位置,mask参数保留SVG的透明区域 img.paste(svg_img, (x, y), mask=svg_img) # 最后可以保存成JPG或其他格式 img.save("pattern.jpg")
关键说明
- 你之前的代码无法运行是因为
ImageDraw没有直接绘制SVG的方法,必须先把SVG转成PIL图像对象 - 使用
io.BytesIO可以在内存中处理转换后的SVG数据,不用生成中间文件 - 转成RGBA格式并使用mask参数,能保留SVG的透明效果(如果你的SVG有透明区域的话)
内容的提问来源于stack exchange,提问作者Firefoxer
相关产品推荐
相关产品推荐

