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

Den*_*aia 31 inkscape svg

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

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

Den*_*aia 32

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

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

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

尽管此解决方案有效,但它有点麻烦,我很想学习更好的解决方案。

  • +1 - 我使用这种方法导出了一个 3.5 MB 的图像,这需要一段时间但有效。不知何故,“提取图像”功能对我不起作用。 (2认同)

小智 20

有一个更好的解决方案:

转到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);
Run Code Online (Sandbox Code Playgroud)

这样我就可以获得我想要的所有图像,而 md5 使我免于获得重复的图像。

我敢打赌一定有另一种更简单的方法,但是要让inkscape 开发人员做得更好。


Den*_*aia 12

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

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

此脚本是为 Python 2.7 编写的,但转换为 Python 3 应该很容易。更好的是,由于该版本中引入的新功能,转换为 Python 3.4 后可以删除大约 50 行。


Nic*_*son 5

作为另一种解决方法,您可以另存为 PDF,然后使用 Inkscape 打开该文档。

取消选中“嵌入图像”,然后宾果游戏,所有 png/jpeg 将被喷出到您的主目录中。

凌乱,但比玩弄数据更快:URL。