Как извлечь встроенное изображение из SVG-файла?

У меня есть SVG-файл, который содержит по крайней мере одно встроенное изображение JPG / PNG внутри. Я хочу извлечь изображения JPG / PNG из этого SVG-файла и сохранить их на диске.

Я добавляю тег inkscape поскольку это программа, которую я использую для редактирования SVG-файлов, но я также принимаю решения, используя другие инструменты.

Мое собственное решение (или … обходное решение):

  1. Выберите изображение в Inkscape
  2. Откройте встроенный XML Editor ( Shift + Ctrl + X )
  3. Выберите xlink:href , который будет содержать изображение в виде данных: URI
  4. Скопируйте все data: URI
  5. Вставьте эти data: URI в браузер и сохраните его оттуда.

Кроме того, я могу открыть SVG-файл в любом текстовом редакторе, найти URI data: и скопировать его оттуда.

Хотя это решение работает, оно довольно громоздко, и мне бы хотелось узнать лучше.

Вместо этого есть лучшее решение:

Перейдите к Extensions -> Images -> Extract Image... , там вы можете сохранить выбранное растровое изображение в виде файла. Однако это расширение работает странно и как-то работает довольно медленно (но отлично).

Еще одно замечание: это расширение громоздко и бесшумно умирает при изменении больших изображений. Кроме того, с большим количеством растровых изображений он может увеличить использование памяти inkscape до ужасающих уровней (например, 3 ГБ после того, как только несколько извлеченных изображений).

Поскольку у меня есть около 20 файлов SVG с примерно 70 растровыми изображениями в каждом из них, каждое изображение размером не менее 1 МБ, мне нужно другое решение. После короткой проверки с помощью подсказки 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 это лучше.

Наконец, спустя годы я написал сценарий для правильного извлечения всех изображений из файла SVG с использованием соответствующей библиотеки XML для анализа SVG-кода.

http://bitbucket.org/denilsonsa/small_scripts/src/tip/extract_embedded_images_from_svg.py

Этот скрипт написан для Python 2.7, но его довольно легко преобразовать в Python 3. Еще лучше, после преобразования в Python 3.4 можно удалить около 50 строк из-за новых функций, представленных в этой версии.

В качестве еще одного обходного пути вы можете сохранить в формате PDF, а затем открыть этот документ с помощью Inkscape.

Снимите флажок «вставлять изображения» и «бинго», все pngs / jpeg будут извергнуты в ваш домашний каталог.

Беспощадно, но быстрее, чем с данными: URL.

Откройте файл Inkscape и выберите растровое изображение, которое вы хотите экспортировать. Нажмите «Файл»> «Экспортировать растровое изображение» (Ctrl + Shift + E), и он должен экспортировать только выбранное растровое изображение.

Я улучшаю php-скрипт @Johnny_Bit . Новая версия скрипта может использовать svg с новыми строками. Он извлекает несколько изображений из файла svg и сохраняет их во внешних файлах png. Файлы Svg и png находятся в каталоге 'svg', но вы можете изменить его в константе 'SVG_DIR'.

 <?php define ( 'SVG_DIR', 'svg/' ); define ( 'SVG_PREFIX', 'new-' ); $svgs = glob(SVG_DIR.'*.svg'); $external = array(); $img = 1; foreach ($svgs as $svg) { echo '<p>'; $svg_data = file_get_contents( $svg ); $svg_data = str_replace( array("\n\r","\n","\r"), "", $svg_data); $svg_file = substr($svg, strlen(SVG_DIR) ); echo $svg_file.': '.strlen($svg_data).' ????'; if ( preg_match_all( '|<image[^>]+>|', $svg_data, $images, PREG_SET_ORDER) ) { foreach ($images as $image_tag) { if ( preg_match('%xlink:href="data:([a-z0-9-/]+);base64,([^"]+)"%i', $image_tag[0], $regs) ) { echo '<br/>Embeded image has benn saved to file: '; $type = $old_type = $regs[1]; $data = $old_data = $regs[2]; $md5 = md5($data); if ( array_key_exists($md5, $external) ) { $image_file = $external[$md5]; } else { $data = str_replace(" ", "\r\n", $data); $data = base64_decode($data); $type = explode('/', $type); $image_file = substr( $svg_file, 0, strlen($svg_file)-4 ) . '-' . ($img++) . '.png'; file_put_contents(SVG_DIR.$image_file, $data); $external[$md5] = $image_file; } echo $image_file; $svg_data = str_replace('xlink:href="data:'.$old_type.';base64,'.$old_data.'"', 'xlink:href="'.$image_file.'"', $svg_data); } } file_put_contents(SVG_DIR.SVG_PREFIX.'.svg', $svg_data); } echo '</p>'; } ?> 
  • Линия SVG с gradleиентным штрихом не будет отображаться прямо
  • Наполнение анимации воды
  • Как масштабировать SVG-изображение, чтобы заполнить окно браузера?
  • Chrome не передает SVG с помощью тега
  • Интерполяция Catmull-Rom на пути SVG
  • Элемент SVG USE и стиль наведения
  • Как установить происхождение трансформации в SVG
  • Можете ли вы контролировать, как нарисована ширина штриха SVG?
  • Волна (или форма?) С рамкой на CSS3
  • Доступность: рекомендуемое соглашение об альт-тексте для SVG и MathML?
  • Как включить стиль CSS при преобразовании svg в png
  • Interesting Posts

    Как установить размер окна окна PowerShell по умолчанию в Windows 7?

    Список vs BindingList Преимущества / Недостатки

    Резервное копирование образа изображения в Time Machine

    Почему переопределенная функция в производном classе скрывает другие перегрузки базового classа?

    У меня проблемы с главной страницей Google, результатами поиска, изображениями Google. Их показывают очень необычно. В чем причина этого?

    Диалоговое окно LocationSettingsRequest для включения GPS-onActivityResult () пропущено

    Использование Samba для совместного использования папки у гостя Linux с хостом Windows в VirtualBox

    Как получить доступ к свойствам стиля псевдоэлементов с помощью jQuery?

    Рисование объекта с использованием getGraphics () без расширения JFrame

    Symfony 2: создание службы из репозитория

    Force R не использовать экспоненциальную нотацию (например, e + 10)?

    Расположение координатора с панелью инструментов во fragmentах или действиях

    Ubuntu перезапускает случайно

    Является ли C ++ std :: set streamобезопасным?

    Рекомендация утилиты Deep clone

    Давайте будем гением компьютера.