Как я могу прочитать данные SVG инсульта в Pycairo?

У меня есть изображения в формате JPG, а с помощью inputvgdraw, флеш-инструмента для аннотирования изображений ( http://www.mainada.net/inputdraw), я могу отследить на нем линии, которые генерируют данные svg.

образец данных SVG:

<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>.

Какая функция может управлять этими данными?

1 ответ

Вы можете прочитать входные данные SVG, используя librsvg а затем рендеринг с 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])

cairosvg может загружать файлы SVG в ImageSurface pycairo:

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. Для этого потребовалось только принять импорт и одно небольшое изменение.

Другие вопросы по тегам