Я нашел этот пример на ТАК в Вопросы и ответы названный: Как преобразовать изображение JPEG в использование формата SVG ImageMagick?. Один из ответов предлагается potrace
.
$ convert input.jpg output.ppm
$ potrace -s output.ppm -o svgout.svg
Взгляд на potrace
веб-сайт можно, по-видимому, пойти непосредственно от BMP до SVG.
$ potrace -s input.bmp -o output.svg
Другая опция к potrace
autotrace
.
$ autotrace -output-file ouput.svg -output-format svg --color-count 4 input.bmp
Необходимо будет, вероятно, играть с --color-count
получить изображение это комплекты Ваши потребности.
Из этих 2 это действительно зависит от исходного материала. Если Вы преобразовываете изображения затем potrace
вероятно более оптимальный вариант. Для нефото материала, такого как шрифты и неодушевленные объекты, такие как пейзаж, который включает вещи как дороги, затем autotrace
с --centerline
переключатель.
В то время как не оптимальный для фотографий, это делает хорошее задание на штриховой графике и подобных плакату изображениях. Не также успевает с цветом. Автотрассировка имеет некоторые функции, не доступные во встроенном диалоговом окне Potrace в Inkscape. Например, существует переключатель средней линии, который особенно полезен для трассировки дорог (в картах) или символы шрифта.
Можно перенести любую из этих команд в для цикла в Bash, который сделает легкую работу из выполнения объемных задач преобразования.
$ for i in *.bmp; do ... "$i"; done
Извлеките часть IFS
.
$IFS
является внутренней переменной разделителя полей bash
. Строка в скрипте приводит к тому, что bash
разделяет поля только в новых строках, а не по умолчанию (пробел, табуляция и новая строка). Вывод ls
разделен на табуляции.
This works:
#!/bin/bash
command="ls /tmp"
for file in `$command`;
do
echo $file
done
Проблема в том, что bash не будет правильно выполнять переменные, содержащие пробелы, потому что вы установили $ IFS
на новую строку. Это заставляет его пытаться выполнить все как одну команду вместо того, чтобы принимать первое слово как команду и передавать остальные как аргументы.
Если бы вы запустили это с помощью strace
, вместо того, чтобы увидеть это:
execve("/bin/ls", ["ls", "/tmp"], [/* 42 vars */]) = 0
--- -----
| |-------------> 2nd argument
|---------------------> 1st argument, the command to run.
, вы бы увидели, что первый аргумент - ls / tmp
вместо ls
в одиночку, и это то, что система не может выполнить.
Ваш сценарий действительно будет работать так, как вы ожидаете, если вы не установите переменную IFS
. Однако вам действительно никогда не следует использовать ls
для перебора вывода команды, если вы не знаете , что вывод никогда не будет содержать пробелов или других странных символов. Для иллюстрации:
$ touch 'file name with spaces'
$ for i in $(ls ./); do echo "$i"; done
file
name
with
spaces
Правильный способ - использовать один из следующих:
$ for i in *; do echo "i is: $i"; done
i is: file name with spaces
$ find . -type f | while IFS= read -r i; do echo "i is: $i"; done
i is: ./file name with spaces
Если вы действительно, действительно хотите использовать ls
, по крайней мере, используйте его с циклом while. Это по-прежнему будет нарушать различные функции, но, по крайней мере, может иметь дело с пробелами:
$ ls | while read i; do echo "i is: $i"; done
i is: file name with spaces
Наконец, чтобы иметь возможность иметь дело с любым именем файла, включая те, которые содержат символы новой строки, обратную косую черту, пробелы или что-то еще. Используйте:
$ find . -type f -print0 | while IFS= read -r -d '' i; do echo "i is: $i"; done
i is: ./file name with spaces