Конвертировать 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


Другие вопросы по тегам