我有JPG图像和inputsvgdraw,一个用于图像标注的闪存工具(http://www.mainada.net/inputdraw),我可以在其上跟踪生成svg数据的行。
svg datas sample:
<svg version="1.1" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 488 325"><g fill="none" stroke-miterlimit="6" stroke-linecap="round" stroke-linejoin="round"><path d="M 307 97 l 0 -1 l -2 -1 l -10 -2 l -20 -1 l -25 5 l -22 9 l -10 9 l 0 9 l 2 12 l 16 18 l 25 11 l 25 5 l 17 -1 l 6 -4 l 3 -7 l -1 -12 l -6 -16 l -7 -13 l -11 -12 l -11 -14 l -9 -5" opacity="1" stroke="rgb(170,37,34)" stroke-width="5"/></g></svg>.
哪些功能可以管理这些数据?
答案 0 :(得分:2)
您可以使用librsvg
读取SVG输入,然后使用cairo
进行渲染。如果您想在初始图像上绘制SVG中的注释,则可能需要将PIL
与numpy
一起使用,因为cairo
本身不会加载许多不同的图像格式。
以下是一个实现该目标的示例(唯一的区别是实际上我使用ctypes
的特别rsvg
包装器对其进行了测试:
import sys
import rsvg
import cairo
import numpy
from PIL import Image
# Load an image that supposedly has the same width and height as the svg one.
img_rgba = numpy.array(Image.open(sys.argv[1]).convert('RGBA'))
data = numpy.array(img_rgba.tostring('raw', 'BGRA'))
width, height = img_rgba.size
surface = cairo.ImageSurface.create_for_data(data,
cairo.FORMAT_ARGB32, width, height)
ctx = cairo.Context(surface)
# "Paste" the svg into the image.
svg = rsvg.Handle(file=sys.argv[2])
svg.render_cairo(ctx)
surface.write_to_png(sys.argv[3])
答案 1 :(得分:0)
cairosvg可以将SVG文件加载到pycairo ImageSurface:
from cairocffi import ImageSurface
from cairosvg.parser import Tree
from cairosvg.surface import PNGSurface
def load_svg(svg: bytes) -> ImageSurface:
return PNGSurface(Tree(bytestring=svg), None, 1).cairo
我使用PNGSurface,因为它将数据渲染到ImageSurface。这里不使用PNG功能。
不幸的是,cairosvg使用cairocffi而不是pycairo。这就是为什么我将整个项目更改为cairocffi的原因。这只需要采用进口商品,并且需要一点改动。