You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何结合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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.25 23:45:36