Да, это возможно. Узнайте, как работает feDisplacementMap
.
https://www.w3.org/TR/SVG11/single-page.html#filters-feDisplacementMapElement
Все, что вам нужно сделать, это убедиться, что пиксели вне круга вызывают смещение 0. Для этого значение цветового канала должно быть 0,5 (128).
Таким образом, если ваш X-канал является красным каналом, а Y-канал - зеленым, то создание области за пределами круга на 50% желтого цвета (т. Е. # 808000) должно привести к нулевому смещению.
Обновление: как работает feDisplacementMap
Принцип работы feDisplacement
заключается в том, что он берет значение пикселя из «карты смещения» (in2
) и использует цветовые каналы этого пикселя для определения местоположения в другом месте на верхнем изображении in
, с которого копируется пиксель.
Так, например, скажем, мы в настоящее время смотрим на пиксель (100 200).
- Посмотрите на пиксель в (100,200) в
in2
- Определить смещение смещения. Допустим, это (-0,4, 0,5). Мы увидим, как мы получим эти значения позже.
- Умножьте смещение на
scale
. Если масштаб 10
, новое смещение будет (-4, 5)
- Получить пиксель в (
100 - 4
, 200 - 5
) в in
- Запишите это значение пикселя в (100,200) на выходе (
result
).
Разработка смещения
Начните с просмотра соответствующего цветового канала (R, G, B или A) в пикселе in2
. Цветовой канал, который используется для смещений X и Y, устанавливается с помощью атрибутов xChannelSelector
и yChannelSelector
.
Каждый из этих каналов может иметь значение от 0 до 255. Для канала R 0 означает отсутствие красного, а 255 означает полный красный. Для расчета смещения вне диапазона 0..255 преобразуется в диапазон 0..1.
+----------------------+------+------------+
| Colour channel value | XC() | XC() - 0.5 |
+----------------------+------+------------+
| 0 (00) | 0 | -0.5 |
| 26 (1A) | 0.1 | -0.4 |
| 128 (80) | 0.5 | 0 |
| 255 (FF) | 1 | 0.5 |
+----------------------+------+------------+
Так что если xChannelSelector="R"
и yChannelSelector="G"
, то значение пикселя #1AFF00
в нашем in2
приведет к смещению смещения (-0,4, 0,5), которое мы использовали выше.
Вернуться к картам смещения определенной формы
Из вышесказанного, мы надеемся, вы увидите, что, если канал пикселя in2
имеет значение 128
, это приведет к смещению нуля. Это означает, что выходной пиксель в result
будет скопирован непосредственно из той же позиции на входе (in
).
Итак, чтобы создать карту с круговой границей. Все, что вам нужно сделать, это сделать все пиксели за пределами круга 128
.
Проблема с feDisplacementMap
Изменения, произошедшие за последние пару лет с целью предотвращения некоторых проблем безопасности, связанных с feDisplacementMap
, привели к тому, что его может быть довольно сложно использовать прямо сейчас.
В этом процессе еще остались ошибки. Например: https://bugs.chromium.org/p/chromium/issues/detail?id=798001
Плюс есть ошибки с feImage
: например. https://bugzilla.mozilla.org/show_bug.cgi?id=455986
Скорее всего, вам потребуется использовать внешние образы с feImage
и убедиться, что на вашем веб-сервере установлены правильные настройки CORS.
Альтернативно, использование URL-адресов данных с feImage
, кажется, работает нормально. См. этот CodePen от @ enxaneta .
Надеюсь, это помогло.