如何从 SVG 文件中提取嵌入的图像?

如何从 SVG 文件中提取嵌入的图像?

我有一个 SVG 文件,其中包含至少一个嵌入的 JPG/PNG 图像。我想从该 SVG 文件中提取 JPG/PNG 图像并将其保存在磁盘上。

我添加inkscape标签是因为它是我用来编辑 SVG 文件的程序,但我也接受使用其他工具的解决方案。

答案1

我自己的解决方案(或......解决方法):

  1. 在 Inkscape 中选择图像
  2. 打开内置XML Editor( Shift++ Ctrl)X
  3. 选择xlink:href包含图像的属性数据:URI
  4. 复制整个data:URI
  5. 将该 URI 粘贴data:到浏览器中,然后保存。

或者,我可以在任何文本编辑器中打开 SVG 文件,找到data:URI 并从那里复制它。

虽然这个解决方案有效,但它有点麻烦,我很想学习一个更好的解决方案。

答案2

有一个更好的解决方案:

转到Extensions -> Images -> Extract Image...,在那里您可以将选定的光栅图像保存为文件。但是这个扩展工作起来很奇怪,而且不知何故运行得相当慢(但运行得很好)。

另一个注意事项:此扩展很麻烦,在处理大量图像时会悄无声息地死机。此外,如果有大量光栅图像,它会使 Inkscape 的内存使用量激增到可怕的水平(例如,仅提取少量图像后内存使用量就达到 3GB)。

因为我有大约 20 个 svg 文件,每个文件大约有 70 个光栅图像,每个图像至少有 1MB 大小,所以我需要一个不同的解决方案。经过简短的检查,使用Denilson Sá 提示我设计了以下 php 脚本,从 svg 文件中提取图像:

#!/usr/bin/env php
<?php

$svgs = glob('*.svg');

$existing = array();

foreach ($svgs as $svg){
    mkdir("./{$svg}.images");
    $lines = file($svg);
    $img = 0;
    foreach ($lines as $line){
        if (preg_match('%xlink:href="data:([a-z0-9-/]+);base64,([^"]+)"%i', $line, $regs)) {
            $type = $regs[1];
            $data = $regs[2];
            $md5 = md5($data);
            if (!in_array($md5, $existing)) {
                $data = str_replace(' ', "\r\n", $data);
                $data = base64_decode($data);
                $type = explode('/', $type);
                $save = "./{$svg}.images/{$img}.{$type[1]}";
                file_put_contents($save, $data);
                $img++;
                $existing[] = $md5;
            }
        } else {
            $result = "";
        }
    }
}

echo count($existing);

这样我就可以得到我想要的所有图像,并且 md5 可以让我避免得到重复的图像。

我敢打赌一定还有其他更简单的方法,但这取决于 inkscape 开发人员是否能做得更好。

答案3

最后,几年后,我编写了一个脚本,使用适当的 XML 库来解析 SVG 代码,从 SVG 文件正确提取所有图像。

https://github.com/denilsonsa/small_scripts/blob/master/extract_embedded_images_from_svg.py

此脚本需要 Python 3.4 或更高版本。(查看git 历史如果您需要在旧版本的 Python 上运行。)

答案4

在以下位置打开图片Inkscape,右键单击它,在上下文菜单中选择提取图像您就完成了。

相关内容