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

如何将Python Skia的DynamicMemoryWStream转换为SVG文件?

将Skia DynamicMemoryWStream转换为SVG文件的方法

首先需要明确:如果你的DynamicMemoryWStream中存储的是光栅像素数据(比如从RasterSurface写入的像素),这类数据无法直接转换为SVG格式(SVG是矢量图形格式,与光栅位图本质不同)。此时你需要调整流程,改用矢量方式记录绘图操作再导出SVG。

以下是两种可行的实现方案:

方案一:直接使用SVGSurface生成SVG

这是生成SVG的标准方式,无需先写入DynamicMemoryWStream:

import skia

# 定义SVG尺寸
width, height = 500, 500

# 创建SVGSurface,指定输出文件路径
with skia.SVGSurface.MakeFromFile("output.svg", width, height) as surface:
    canvas = surface.getCanvas()
    # 在这里执行你的绘图操作(示例:画一个红色矩形)
    canvas.drawRect(skia.Rect(100, 100, 400, 400), skia.Paint(skia.ColorRED))
# 退出with块后,Surface会自动完成SVG写入并关闭文件

方案二:从已序列化的Picture生成SVG

如果你的DynamicMemoryWStream中存储的是Skia Picture的序列化数据(即通过Picture.serialize()写入的内容),可以先反序列化得到Picture,再将其渲染到SVGSurface:

import skia

# 将流指针移到起始位置
stream.seek(0)
# 反序列化得到Picture对象
picture = skia.Picture.MakeFromStream(stream)

# 获取Picture的尺寸
bounds = picture.cullRect()
width, height = bounds.width(), bounds.height()

# 创建SVGSurface并渲染Picture
with skia.SVGSurface.MakeFromFile("output.svg", width, height) as surface:
    canvas = surface.getCanvas()
    canvas.drawPicture(picture)

补充说明

若你之前的操作是向DynamicMemoryWStream写入光栅像素,必须改为用PictureRecorder记录绘图命令,再序列化到流:

import skia

recorder = skia.PictureRecorder()
canvas = recorder.beginRecording(skia.Rect(0, 0, 500, 500))
# 执行绘图操作(示例:画蓝色圆形)
canvas.drawCircle(250, 250, 100, skia.Paint(skia.ColorBLUE))
picture = recorder.finishRecordingAsPicture()

# 将Picture序列化到DynamicMemoryWStream
stream = skia.DynamicMemoryWStream()
picture.serialize(stream)

之后再用方案二的代码将其转换为SVG。

内容的提问来源于stack exchange,提问作者Rui

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.14 03:05:17