Конвертировать SVG в PNG с острыми краями - PullRequest
0 голосов
/ 04 января 2019

Мне нужно конвертировать изображения для обнаружения объектов.Я начинаю с изображений 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, svgr-convert или ImageMagikk.Однако края этих изображений png всегда размыты, что мешает моему обнаружению объекта.

Есть ли какой-нибудь способ конвертировать с четкими краями? Это изображение показывает преобразование с добавлением размытых пикселей с неправильными значениями.Я увеличил границы, чтобы сделать это очевидным.

edit: пример полного изображения

<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 ]

0 голосов
/ 04 января 2019

Добавить атрибут в элемент <svg> (он наследуется всеми дочерними элементами)

shape-rendering="crispEdges"

Хотя из моего короткого теста Inkscape, похоже, не признает этого, rsvg-convert делает.Для вашей установки Imagemagick вы должны убедиться, что она делегируется librsvg, а не Inkscape.

0 голосов
/ 04 января 2019

Что вам нужно сделать, это увеличить плотность при чтении вашего файла SVG.Вы можете либо увеличить плотность на некоторый коэффициент и сохранить этот результат, либо увеличить плотность на коэффициент, а затем изменить размер на обратный коэффициент.Плотность по умолчанию для SVG составляет 96 точек на дюйм.Поэтому в Imagemagick 6 основная команда будет выглядеть так:

convert test.svg test.png


enter image description here

, что совпадает с

convert -density 96 test.svg test1.png


enter image description here

Теперь вы можете увеличить плотность на 4 до 384.

convert -density 384 test.svg test2.png


enter image description here

или для больших изображений с линейными чертежами, которые необходимо сохранить при исходном разрешении, вы можете уменьшить размер на 1/4 или 25%

convert -density 384 test.svg -resize 25% test3.png


enter image description here

Для Imagemagick 7 измените конвертирование на магию.

ДОПОЛНЕНИЕ:

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

convert -density 1200 test.svg test4.png


enter image description here

...