如何在Windows 10上使用python 3.6.5调整比例的同时调整svg的大小(vscode)

时间:2018-07-26 09:53:45

标签: python svgutils

我正在尝试将一些默认默认值约为420乘500像素的SVG缩小,它们的大小并不相同,但是我想在输出文件上保持50px的宽度。

这是我到目前为止(自this起管理的):

import os
import svgutils


path = 'path/to/files'
svg_files = [f for f in os.listdir(path) if f.endswith('.svg')]

for i in svg_files:
    svg_file = os.path.join(path, i)
    svg = svgutils.transform.fromfile(svg_file)
    original = svgutils.compose.SVG(svg_file)
    original.scale(.1)
    svg_out = os.path.splitext(svg_file)[0] + '_scale.svg'
    new_svg = svgutils.compose.Figure(float(svg.height) * .1,
                                      float(svg.width) * .1, original)
    new_svg.save(svg_out)

但是它只会添加带有转换的<g>,并且不会调整原始大小。而且,最终结果不会在inkscape中显示。

你知道我在做什么错吗?

编辑:

我已经进行了更深入的了解,到目前为止,我已经设法使用this sourceforge project中的librsvg-2.40.1-2-w32-bin.zip来调整svg的大小,并将/bin文件夹添加到Windows路径中,这使我执行以下操作:

rsvg-convert -a ".\infile.svg" -w "30" -f svg -o ".\outfile.svg"

但是,不会保留任何颜色信息。所以我到目前为止。

编辑2:

使用rsvg-convert进行转换时会发生颜色问题,在此过程中似乎还会将十六进制转换为rgb元组。有些观看者不支持的内容(例如MapboxGL studio)

2 个答案:

答案 0 :(得分:1)

这是我到目前为止所拥有的:

# scale SVG images from files

import os
import re
import svgutils as su

SCALE = .1
path = 'E:/Slicke/Sitne'
svg_files = [f for f in os.listdir(path) if f.endswith('.svg')]

for i in svg_files:
    svg_file = os.path.join(path, i)

    # Get SVGFigure from file
    original = su.transform.fromfile(svg_file)

    # Original size is represetnted as string (examle: '600px'); convert to float
    original_width = float(re.sub('[^0-9]','', original.width))
    original_height = float(re.sub('[^0-9]','', original.width))

    scaled = su.transform.SVGFigure(original_width * SCALE, original_height * SCALE,)
    # Get the root element
    svg = original.getroot()

    # Scale the root element
    svg.scale_xy(SCALE, SCALE)

    # Add scaled svg element to figure
    scaled.append(svg)
    # Create the path and new file name
    svg_out = os.path.splitext(svg_file)[0] + '_scale.svg'
    print(svg_out)
    scaled.save(svg_out)

答案 1 :(得分:0)

经过一番摆弄之后,我终于设法做到了这一点。虽然解决方案相当脏,但可以完成工作。

这是解决方案:

import os
import re
import subprocess
from webcolors import rgb_percent_to_hex

path = 'path/to/svgs'
svg_files = [f for f in os.listdir(path) if f.endswith('.svg')]

def cs(s): return rgb_percent_to_hex((s.group(1), s.group(2), s.group(3)))

# scaling the files
for i in svg_files:
    file_path = os.path.join(path, i)
    svg_path = os.path.splitext(file_path)[0] + '_scaled.svg'
    subprocess.call([
                    'rsvg-convert',
                    '-a',
                    file_path,
                    '-w', '30',
                    '-f', 'svg',
                    '-o', svg_path])

scaled_files = [f for f in os.listdir(path) if f.endswith('_scaled.svg')]
exp = r'rgb\((?:(?P<red>\d{1,3}.?(?:\d{1,50}\%)?)(?:\,?)(?P<green>\d{1,3}.?(?:\d{1,50}\%)?)(?:\,?)(?P<blue>\d{1,3}.?(?:\d{1,50}\%)?)(?:))\)'

for j in scaled_files:
    w = open(os.path.splitext(os.path.join(path, j))[0] + '_hexed.svg', 'w')
    r = open(os.path.join(path, j))
    for l in r:
        w.write(re.sub(exp, cs, l))
    w.close()
    r.close()