Source code for pyquickhelper.imghelper.svg_helper

"""
Helpers around images and :epkg:`SVG`.

.. versionadded:: 1.7


:githublink:`%|py|7`
"""
import xml.etree.ElementTree as ET
try:
    from io import BytesIO
except ImportError:
    # Python 2.7
    from StringIO import StringIO as BytesIO

from .excs import PYQImageException


[docs]def guess_svg_size(svg): """ Guesses the dimension of a :epkg:`SVG` image. :param svg: :epkg:`SVG` description :return: size (x, y) :githublink:`%|py|23` """ mx, my = 0, 0 tree = ET.fromstring(svg) for elt in tree.iter(): for k, v in elt.attrib.items(): if k in ('x', 'cx', 'width'): mx = max(0, int(v)) elif k in ('rx',): mx = max(0, 2 * int(v)) elif k in ('y', 'cy', 'height'): my = max(0, int(v)) elif k in ('ry',): my = max(0, 2 * int(v)) return (mx, my)
[docs]def svg2img(svg, dpi=None, scale=1., **kwargs): """ Converts an image in :epkg:`SVG` format. :param svg: svg :param dpi: image resolution :param scale: scale :param kwargs: additional parameters :return: image The module relies on the following dependencies: * :epkg:`cairosvg` * :epkg:`Pillow` :githublink:`%|py|53` """ kwargs = {} if dpi: kwargs['dpi'] = dpi if scale not in (None, 1., 1): kwargs['scale'] = scale from cairosvg import svg2png img = BytesIO() try: svg2png(svg, write_to=img, **kwargs) except OSError as e: if svg.startswith('<svg>'): size = guess_svg_size(svg) head = '<svg width="{}" height="{}">'.format(*size) svg = head + svg[5:] return svg2img(svg, dpi=dpi, scale=scale, **kwargs) else: raise PYQImageException( "width and height must be specified. This might be the error.") from e png = img.getvalue() st = BytesIO(png) from PIL import Image return Image.open(st)