0

我正在使用 svgwrite 和 python 从位图在 SVG 中形成图像,其中每条线都由 theta 围绕一个共同的原点旋转成扇形图案。目前,这张图片在 128 行中运行大约 10 MB,主要是因为在 79000 多个线段(每个像素一个线段)中保留了过多的浮点数。

扫描转换图像

我想通过从原点到终点绘制一条线,然后在该 SVG 线上拉伸一条线“图像”来显着减小图像尺寸。这可能使用SVG吗?除此之外,我对任何可能显着减小尺寸的建议持开放态度,因此我稍后可以对线条进行动画处理。

4

1 回答 1

1

这个解决方案怎么样(见小提琴):

  1. 将图像切成所需的条数。对于链接小提琴中的示例,我使用 ImageMagick 如下将 128x128 PNG 图像切割成 128 个垂直条:
    convert image.png -crop 1x128 +repage +adjoin strip-%d.png
  2. 将所有图像条转换为数据 URI 格式并将它们嵌入到 SVG 中。我使用了这个 bash 单线:
    for i in strip-*.png; do echo "data:image/png;base64,$(openssl base64 < $i | tr -d '\n')"; done > data-uris.txt
  3. 在 SVG 中,使用条形元素transform()上的属性image将它们旋转到所需的度数。

对于一个 16.4KB 的 128x128 PNG 图标,我最终得到一个 128.1KB 的 SVG 文件。其中大部分是 base64 编码的图像数据(128 个 PNG 条带的总大小已经是 85.1KB)。通过四舍五入一些浮点数可以进一步减少它,但我认为不会有很多收获。

可能还有另一种方法,您可以将图像作为一个整体嵌入,并一遍又一遍地引用同一图像的另一个剪辑部分,但我无法让它工作。

于 2017-03-29T10:52:05.213 回答