Как уменьшить непрозрачность альфа-слоя в фильтре svg?

Я пытаюсь создать логотип в виде SVG. Я экспортировал файл из Illustrator. На логотипе есть тень. Я просматривал XML и нашел узел фильтра

<filter  filterUnits="objectBoundingBox" width="200%" height="160%" x="-15%" y="-15%" id="AI_Shadow_2">
<feGaussianBlur  stdDeviation="2" result="blur" in="SourceAlpha"></feGaussianBlur>
<feOffset  result="offsetBlurredAlpha" in="blur" dy="0" dx="0"></feOffset>
<feMerge>
    <feMergeNode  in="offsetBlurredAlpha"></feMergeNode>
    <feMergeNode  in="SourceGraphic"></feMergeNode>
</feMerge>

Is there a way to change the alpha of the offsetBlurredAlpha generated? I don't want it to start at pure black I want it to start at 50% black so that the shadow effect is light enough around the object.


person ddilsaver    schedule 14.02.2013    source источник


Ответы (3)


Один из способов — добавить примитив фильтра feComponentTransfer, например:

<filter id="dropshadow">
  <feGaussianBlur in="SourceAlpha" stdDeviation="3"/> 
  <feOffset dx="2" dy="2"/>
  <feComponentTransfer>
    <feFuncA type="linear" slope="0.2"/>
  </feComponentTransfer>
  <feMerge> 
    <feMergeNode/>
    <feMergeNode in="SourceGraphic"/> 
  </feMerge>
</filter>

Живой пример можно увидеть здесь.

person Erik Dahlström    schedule 14.02.2013
comment
Идеально то, что я искал. Изменяется ли значение наклона от 0,1 до 1? Просто интересны ограничения. - person ddilsaver; 14.02.2013
comment
См. w3.org/TR/SVG11/filters.html#feComponentTransferTypeAttribute. - наклон может быть любым числом, C' = slope * C + intercept определяет результат. - person Erik Dahlström; 14.02.2013

Один из способов — просто использовать opacity: 0.5. Для этого вместо создания фильтра, который объединяет тень с исходным источником сверху, создайте фильтр для только тени и примените его к тегу <use>, который ссылается на фигуру источника.

У этого подхода есть и другие преимущества. Например, теперь вы можете применять отдельные стили только к тени.

#arrow-shadow {
	opacity:0.5;
}
g:hover #arrow-shadow {
	opacity:0.7;
}
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" viewBox="-50 -50 200 200" width="400px">
	<defs>
		<filter id="dropshadow" height="130%">
			<feGaussianBlur in="SourceAlpha" stdDeviation="3" /> 
			<feOffset dx="2" dy="2" result="offsetblur" />
		</filter>
	</defs>
	<g fill="#EEE">
		<use id="arrow-shadow" xlink:href="#polygon" filter="url(#dropshadow)"></use>
		<polygon id="polygon"
				points="58.263,0.056 100,41.85 58.263,83.641 30.662,83.641 62.438,51.866 0,51.866 0,31.611 62.213,31.611 30.605,0 58.263,0.056"/>
		
	</g>
</svg>

person Randy Hudson    schedule 18.08.2017

Альтернативный способ установки альфа-значения — использование примитива фильтра feColorMatrix. Используя это, вы можете одновременно установить значение альфа и цвет тени.

Фильтр ниже умножает альфа-значение на 0.2 и в то же время устанавливает красный цвет тени.

<filter id="dropshadow">
  <feGaussianBlur in="SourceAlpha" stdDeviation="3"/> 
  <feOffset dx="2" dy="2"/>
  <feColorMatrix values="0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0.2 0"/>
  <feMerge> 
    <feMergeNode/>
    <feMergeNode in="SourceGraphic"/> 
  </feMerge>
</filter>

Но если вам нужно изменить только альфа-значение, вероятно, лучшим выбором будет примитив фильтра feComponentTransfer.

person Waruyama    schedule 17.10.2017