У меня есть изображение SVG со многими объектами, сложенными друг в друга. Что мне нужно, так это окончательный SVG с тем же визуальным результатом, но таким образом, чтобы я мог изменить непрозрачность любого объекта, не раскрывая скрытые части нижележащих объектов, показывая только «дыру» позади.
Я сделал эту диаграмму , чтобы проиллюстрировать запрос:
Этот пример выше был сделан вручную с Inkscape, выбирая каждый квадрат и дублируя его столько раз, сколько различий ( ctrl+ -) мне нужно, чтобы «вырезать» основные объекты. Этот метод очень сложно применить к большому количеству объектов.
Будет приветствоваться любое программное обеспечение (Adobe Illustrator, инструмент командной строки...) или метод, решающий эту проблему.
В иллюстраторе:
...выберите фигуры, затем используйте 'Trim'
кнопку в Pathfinder
окне.
Обрезка может вести себя странно с объектами, имеющими прозрачность, так что...
... выберите квадраты, затем Object > Flatten Transparency
установите «векторы» на 100%.
Изображение, иллюстрирующее это из этого другого вопроса :
Иногда Flatten Transparency
оставляет нижний объект неразрезанным, сидя под всем остальным. Если это произойдет, то, поскольку Flatten Transparency
все ваши векторные фигуры имеют непрозрачность 100%, вы можете просто выбрать эту нижнюю фигуру и фигуры, которые перекрывают ее, и использовать, Trim
как указано выше.
Затем сохраните как SVG, если вам нужен SVG. Чтобы избежать проблемы совпадающих краев, которую описывает Илмари Каронен, вы можете Object > Transform > Transform Each
масштабировать каждый объект, скажем, на 100,5% вокруг его собственного центра. Или вы можете дать каждому объекту очень тонкую обводку своего цвета заливки (вероятно, это лучший подход, поскольку в идеале небольшое перекрытие должно быть одинаковым для всех, а не пропорциональным размеру).
У меня есть идея, хотя я уверен, что есть лучший способ.
Использование Inkscape
Edit -> Preferences
в нижней части выделения выберите Bitmaps
набор Resolution (256)
и закройте.Edit -> Make a Bitmap copy
(это займет немного времени, создание изображения).Path -> Trace Bitmap
только в Mode tap
установленном отметке .Multiple scan: Scans (6, one for each color used plus one for background), Colors (on)
Remove background
Options tab
отметке все! Отправить OK
.Right click
в группе выберите Ungroup
.Path -> Break Apart
.Возможно, вам придется удалить некоторые случайные линии.
Обязательно установите Resolution
заднюю часть!. И дайте мне знать, если это работает для вас.
Проблема с попыткой сделать то, о чем вы просите, заключается в том, что ваши фигуры будут иметь совпадающие края. При рендеринге такие края часто выглядят так, как если бы между фигурами был узкий зазор, позволяющий фону немного просвечиваться.
Это происходит по двум причинам — сглаживание и округление:
Во-первых, большинство средств визуализации SVG используют реализацию сглаживания, в которой пиксели вдоль края фигуры отображаются как частично прозрачные, при этом степень прозрачности определяется тем, насколько каждый пиксель перекрывается фигурой. Обычно это дает отличные результаты, но это не идеально, и одна ситуация, которая может выявить его неточности, — это когда края двух фигур точно совпадают.
Чтобы понять, почему это происходит, представьте себе пиксель, половина которого покрыта, скажем, красной фигурой, а ровно противоположная половина покрыта зеленой фигурой, причем обе эти фигуры нарисованы на синем фоне. С «идеальным» визуализатором этот пиксель будет на 50% красным и на 50% зеленым, без просвечивающего синего. Однако в реальном рендерере происходит то, что он сначала рисует, скажем, красную фигуру, делая пиксель на 50% красным и на 50% синим. Затем поверх этого фона рисуется зеленая фигура, в результате чего половина исходной цветовой смеси заменяется зеленым, в результате чего в пикселях остается 25 % красного, 50 % зеленого и 25 % синего.
Другая причина, по которой совпадающие края могут быть проблематичными, заключается в том, что средства визуализации обычно используют математику с плавающей запятой, которая подвержена небольшим ошибкам округления. Таким образом, несмотря на то, что ребра должны точно совпадать, неточности в их вычислении могут немного изменить их фактический путь, оставив крошечный зазор. (Это более серьезная проблема с 3D-рендерингом, где такие числовые проблемы могут оставить рендерера неуверенным в том, какая из двух совпадающих поверхностей должна быть отрисована перед другой, но это также может повлиять на 2D-рендеринг.)
В принципе, проблемы сглаживания можно было бы избежать, если сначала визуализировать все изображение с очень высоким разрешением (скажем, примерно в 16 раз выше целевого разрешения в каждом направлении) без сглаживания, а затем уменьшать его, чтобы сгладить края. Однако это был бы очень дорогой метод рендеринга по сравнению со стандартным рендерингом SVG со сглаживанием, поэтому он обычно не используется. Кроме того, это все еще не полностью решит проблемы с численной точностью.
Таким образом, практическое решение состоит в том, чтобы по возможности избегать совпадающих краев. Пока вы убедитесь, что все соседние фигуры в достаточной степени перекрываются, стандартный алгоритм сглаживания будет работать нормально, и вы не увидите явных промежутков между фигурами.
DA01
Ильмари Каронен
Игнасио Лаго