我有一个 SVG 文件,其中包含至少一个嵌入的 JPG/PNG 图像。我想从该 SVG 文件中提取 JPG/PNG 图像并将其保存在磁盘上。
我添加inkscape
标签是因为它是我用来编辑 SVG 文件的程序,但我也接受使用其他工具的解决方案。
答案1
我自己的解决方案(或......解决方法):
- 在 Inkscape 中选择图像
- 打开内置
XML Editor
( Shift++ Ctrl)X - 选择
xlink:href
包含图像的属性数据:URI - 复制整个
data:
URI - 将该 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,右键单击它,在上下文菜单中选择提取图像您就完成了。