如何将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
相关产品推荐
相关产品推荐

