Конвертировать SVG в PNG с острыми краями
Мне нужно конвертировать изображения для обнаружения объектов. Я начинаю с изображений SVG с несколькими полигонами. Пример:
<svg ...>
<rect width = "100%" height = "100%" fill = "rgb(0,0,0)" />
<polygon points="..." fill="rgb(221,221,221)" fill-opacity="1.0" />
<polygon points="..." fill="rgb(100,100,100)" fill-opacity="0.5" />
</svg>
В результате получается черный фон, объект A, имеющий цвет rgb(221,221,221), объект B, имеющий цвет rgb(50,50,50), и везде два объекта перекрываются rgb(160,160,160). Алгоритм обнаружения (не может быть изменен) определяет объекты по значениям их пикселей.
Я успешно конвертировал из SVG в PNG с помощью Inkscape, SVR-конвертировать или ImageMagikk. Однако края этих изображений PNG всегда размыты, что мешает обнаружению моего объекта.
Есть ли какой-нибудь способ конвертировать с четкими краями? На этом изображении показано преобразование с добавлением размытых пикселей с неправильными значениями. Я увеличил границы, чтобы сделать это очевидным.
редактировать: полный пример изображения
<svg viewBox="17.874 6.66874 74.0131 70.817" xmlns="http://www.w3.org/2000/svg">
<rect width = "100%" height = "100%" fill="black" fill-opacity="1.000000" stroke="black" stroke-opacity="1.000000" stroke-width ="0.000000"/>
<polygon points="66.499391,34.862972 35.730400,51.495089 68.667463,64.499553 " fill="rgb(221,221,221)" fill-opacity="1.000000" />
<polygon points="47.613765,49.254424 23.219703,52.458598 47.246912,50.965952 48.078815,51.599703 49.620943,52.471096 62.516253,65.471290 65.077318,43.877861 51.086443,12.014429 34.861708,20.532821 " fill="rgb(100,100,100)" fill-opacity="0.500000" />
</svg>
2 ответа
Добавьте атрибут в <svg>
элемент (он наследуется всеми дочерними элементами)
shape-rendering="crispEdges"
В то время как из моего короткого теста Inkscape, похоже, не соблюдает этого, rsvg-convert делает это. Для вашей установки Imagemagick вы должны убедиться, что она делегируется librsvg, а не Inkscape.
Что вам нужно сделать, это увеличить плотность при чтении вашего файла SVG. Вы можете либо увеличить плотность на некоторый коэффициент и сохранить этот результат, либо увеличить плотность на коэффициент, а затем изменить размер на обратный коэффициент. Плотность по умолчанию для SVG составляет 96 точек на дюйм. Таким образом, в Imagemagick 6 основной командой будет:
convert test.svg test.png
который так же, как
convert -density 96 test.svg test1.png
Теперь вы можете увеличить плотность от 4 до 384.
convert -density 384 test.svg test2.png
или для больших изображений с линейными чертежами, которые необходимо сохранить с исходным разрешением, вы можете уменьшить размер на 1/4 или 25%
convert -density 384 test.svg -resize 25% test3.png
Для Imagemagick 7 измените конвертирование в магию.
Сложение:
Вот версия, увеличенная с использованием плотности 1200, которая будет выглядеть гладкой, если вы не увеличите изображение до полного разрешения.
convert -density 1200 test.svg test4.png