我有一个 SVG 文件,其中至少包含一个嵌入的 JPG/PNG 图像。我想从该 SVG 文件中提取 JPG/PNG 图像并将它们保存在磁盘上。
我正在添加inkscape标签,因为它是我用来编辑 SVG 文件的程序,但我也接受使用其他工具的解决方案。
小智 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 行。
作为另一种解决方法,您可以另存为 PDF,然后使用 Inkscape 打开该文档。
取消选中“嵌入图像”,然后宾果游戏,所有 png/jpeg 将被喷出到您的主目录中。
凌乱,但比玩弄数据更快:URL。