我正在尝试将一些默认默认值约为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"
但是,不会保留任何颜色信息。所以我到目前为止。
使用rsvg-convert
进行转换时会发生颜色问题,在此过程中似乎还会将十六进制转换为rgb元组。有些观看者不支持的内容(例如MapboxGL studio)
答案 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()