5

Суть: и фильтр и маска на изображение, мне были отданы исходники т.е. наработки но хотелось управлять яркостью изображения, но не через feColorMatrix так как это не удобно.

Есть ли в SVG механизм попроще? Что бы было по типу как в CSS: filter:brightness();

Аналогичный вопрос на toster от коллеги.

Приведу для примера, что необходимо реализовать:

введите сюда описание изображения

Т.е это вот эти квадратные проёмы и как теперь менять яркость изображения с фильтром?

Пример кода:

rect {
  fill: #ccc;
  width: 100px;
  height: 100px;
}
<svg width="500px" height="400px" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
  <defs>
  <mask id="mask">

<rect x="20px" y="20px"></rect> <rect x="150px" y="20px"></rect> <rect x="280px" y="20px"></rect>

<rect x="20px" y="150px"></rect> <rect x="150px" y="150px"></rect> <rect x="280px" y="150px"></rect>

<rect x="20px" y="280px"></rect> <rect x="150px" y="280px"></rect> <rect x="280px" y="280px"></rect>

</mask> <filter id="filter" color-interpolation-filters="sRGB"> <feColorMatrix values="0.6927 0 0 -0.211588 0.15365 0 0.6927 0 -0.211588 0.15365 0 0 0.6927 -0.211588 0.15365 0 0 0 1 0"/> </filter>
</defs>

<image xlink:href="https://i.stack.imgur.com/D3Q3J.jpg" width="500px" height="400px" x="0" y="0" preserveAspectRatio="none" filter="url(#filter)" />

<image xlink:href="https://i.stack.imgur.com/D3Q3J.jpg" width="500px" height="400px" x="0" y="0" preserveAspectRatio="none" mask="url(#mask)" /> </svg>

SVE
  • 22,387
  • спасибо за правку – Резидент Казахстана Feb 09 '19 at 09:55
  • "он на toster.ru задал вопрос ему разумеется помогли один и тот же асс в JS:" на каком это языке))) – SVE Feb 10 '19 at 10:01
  • @HamSter - не понял я – Резидент Казахстана Feb 10 '19 at 10:03
  • "помогли один и тот же асс в JS" набор слов – SVE Feb 10 '19 at 10:05
  • @HamSter ааа....мой вопрос был отредактирован ...там был другой текст ...изначально этот вопрос задал мой Шеф Максим Ленский на тостер но доделать отдал мне - т.е найти способ легко менять цвет заливки ..т.е что бы без матрицы цветов менять в более тёмный цвет ...вопрос отредактировали и удалили эту часть но вот ту оставили ..и получился набор символов – Резидент Казахстана Feb 10 '19 at 10:09

4 Answers4

5

Для информации можно почитать Практические примеры применения масок svg

 .container {
  width:100%;
  height:100%;
  }
<svg  xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" viewBox="0 0 640 480">
    <defs>
     <mask id="msk1"> 
   <rect fill="red" width="100%" height="100%" />
   <g fill="white">
      <rect  class="maskid" x='20px'  y='20px' width='100' height='90'></rect>
      <rect class="maskid" x='150px' y='20px' width='100' height='90'></rect>
      <rect class="maskid" x='280px' y='20px' width='100' height='90'></rect>
  &lt;rect class="maskid" x='20px'  y='140px' width='100' height='90'&gt;&lt;/rect&gt;
  &lt;rect class="maskid" x='150px' y='140px' width='100' height='90'&gt;&lt;/rect&gt;
  &lt;rect class="maskid" x='280px' y='140px' width='100' height='90'&gt;&lt;/rect&gt;

  &lt;rect class="maskid" x='20px'  y='260px' width='100' height='90'&gt;&lt;/rect&gt;
  &lt;rect class="maskid" x='150px' y='260px' width='100' height='90'&gt;&lt;/rect&gt;
  &lt;rect class="maskid" x='280px' y='260px' width='100' height='90'&gt;&lt;/rect&gt; 

</mask> </g> </defs>

<g>
<image xlink:href="https://i.stack.imgur.com/xqOMb.jpg" width="100%" height="100%" mask="url(#msk1)"/> </g>

</svg>

Затемнение фона регулируется насыщенностью цвета комбинированной маски, той части маски, которая отвечает за фон

<mask id="msk1"> <rect fill="#535353" width="100%" height="100%" />

.container {
  width:100%;
  height:100%;
  }
</style>
<svg  xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" viewBox="0 0 640 480">
    <defs>
     <mask id="msk1"> 
  <rect fill="#535353" width="100%" height="100%"  /> 
   <g fill="white">
      <rect  class="maskid" x='20px'  y='20px' width='100' height='90'></rect>
      <rect class="maskid" x='150px' y='20px' width='100' height='90'></rect>
      <rect class="maskid" x='280px' y='20px' width='100' height='90'></rect>
  &lt;rect class="maskid" x='20px'  y='140px' width='100' height='90'&gt;&lt;/rect&gt;
  &lt;rect class="maskid" x='150px' y='140px' width='100' height='90'&gt;&lt;/rect&gt;
  &lt;rect class="maskid" x='280px' y='140px' width='100' height='90'&gt;&lt;/rect&gt;

  &lt;rect class="maskid" x='20px'  y='260px' width='100' height='90'&gt;&lt;/rect&gt;
  &lt;rect class="maskid" x='150px' y='260px' width='100' height='90'&gt;&lt;/rect&gt;
  &lt;rect class="maskid" x='280px' y='260px' width='100' height='90'&gt;&lt;/rect&gt; 

</mask> </g> </defs>

<g>
<rect fill="black" width="100%" height="100%" />
<image xlink:href="https://i.stack.imgur.com/xqOMb.jpg" width="100%" height="100%" mask="url(#msk1)"/> </g>

</svg>

Alexandr_TT
  • 110,146
  • 23
  • 114
  • 384
4

Свой фан вариант приведу:

*,
:before,
:after {
  box-sizing: border-box;
}

html, body { height: 100%; padding: 0; margin: 0; }

body { font-family: sans-serif; }

.wrapper { height: 100%; text-align: center; background: url(https://images.unsplash.com/photo-1529408632839-a54952c491e5?ixlib=rb-1.2.1&auto=format&fit=crop&w=1950&q=80) center no-repeat; -webkit-background-size: cover; background-size: cover; overflow: hidden; position: relative; }

h1 { background-color: rgba(0, 0, 0, .5); overflow: hidden; color: transparent; margin: 0; padding: 0; font-size: 150px; height: 100%; width: 100%; position: absolute; top: 0; left: 0; }

h1 span { background: url(https://images.unsplash.com/photo-1529408632839-a54952c491e5?ixlib=rb-1.2.1&auto=format&fit=crop&w=1950&q=80) center no-repeat; -webkit-background-size: cover; background-size: cover; -webkit-text-fill-color: transparent; -webkit-background-clip: text; display: block; width: 100%; height: 100%; top: 0; left: 0; text-align: right; padding-top: 10%; padding-right: 20%; position: absolute; }

<div class="wrapper">
  <h1><span> ■ ■<br>■ ■</span></h1>
</div>

P.S: Только для современных браузеров, в FF работает, но в IE уже нет.

SVE
  • 22,387
  • 1
    плюс поставил - в чате я сделал вообще проще что работать будет даже в IE6 – Резидент Казахстана Feb 10 '19 at 10:51
  • @ПавелВаршавский, опубликуйте ответом свой рабочий вариант, а то где-то в каком-то чате ) – SVE Feb 10 '19 at 10:52
  • Там просто блок с фоном и завален он inline-block с прозрачным тёмным фоном ...опытным путём вычислил нужные и сделал прозрачными - вот https://codepen.io/topicstarter/pen/mvXomY а вот здесь я делал : https://chat.stackexchange.com/rooms/70612/svg-chat – Резидент Казахстана Feb 10 '19 at 11:04
  • @HamSter а если понадобится не прямоугольниками вырезать, а более сложной формой? Тогда это решение не сработает. Поставил плюс, как за вариант решения. – Alexandr_TT Feb 10 '19 at 13:03
  • @Alexandr_TT, это же фан вариант, без претензий на ответ) Тут только для звездочек, снежинок, кружочков, треугольников ))) для всего набора html символов. – SVE Feb 10 '19 at 13:56
3

Решил добавить rect и через fill-opacity менять яркость

Осталось решить проблему с дублированием изображения

<svg width="640px" height="480px" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
    <defs>
      <style>
        .maskid{
          fill:#fff;
          width:100px;
          height:100px;
        }
      </style>
      <mask id="mask">
      <rect class="maskid" x='20px'  y='20px'></rect>
      <rect class="maskid" x='150px' y='20px'></rect>
      <rect class="maskid" x='280px' y='20px'></rect>
  &lt;rect class="maskid" x='20px'  y='140px'&gt;&lt;/rect&gt;
  &lt;rect class="maskid" x='150px' y='140px'&gt;&lt;/rect&gt;
  &lt;rect class="maskid" x='280px' y='140px'&gt;&lt;/rect&gt;

  &lt;rect class="maskid" x='20px'  y='260px'&gt;&lt;/rect&gt;
  &lt;rect class="maskid" x='150px' y='260px'&gt;&lt;/rect&gt;
  &lt;rect class="maskid" x='280px' y='260px'&gt;&lt;/rect&gt;

</mask> </defs>

<g>
<image xlink:href="https://i.stack.imgur.com/xqOMb.jpg" x="0" y="0" width="640px" height="480px" />

<rect width="640px" height="480px" x="0" y="0" fill="#000" fill-opacity="0.8";" /> </g> <g> <image xlink:href="https://i.stack.imgur.com/xqOMb.jpg" x="0" y="0" width="640px" height="480px" mask="url(#mask)"/> </g> </svg>

3

Анимация трафарета

Увеличение ячеек

Трафарет в начальном положении находится в верхнем левом углу, затем происходит его увеличение до размера одной ячейки на весь экран.

.container {
  width:100%;
  height:100%;
  }
<svg id="svg1"  xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" viewBox="0 0 640 480">
    <defs>
     <mask id="msk1"> 
  <rect fill="#535353" width="100%" height="100%"  /> 
 <g id="gr1" transform="scale(0.15)" fill="white">
      <rect class="maskid" x='20px'  y='20px' width='100' height='90'></rect>
      <rect class="maskid" x='150px' y='20px' width='100' height='90'></rect>
      <rect class="maskid" x='280px' y='20px' width='100' height='90'></rect>
  &lt;rect class="maskid" x='20px'  y='140px' width='100' height='90'&gt;&lt;/rect&gt;
  &lt;rect class="maskid" x='150px' y='140px' width='100' height='90'&gt;&lt;/rect&gt;
  &lt;rect class="maskid" x='280px' y='140px' width='100' height='90'&gt;&lt;/rect&gt;

  &lt;rect class="maskid" x='20px'  y='260px' width='100' height='90'&gt;&lt;/rect&gt;
  &lt;rect class="maskid" x='150px' y='260px' width='100' height='90'&gt;&lt;/rect&gt;
  &lt;rect class="maskid" x='280px' y='260px' width='100' height='90'&gt;&lt;/rect&gt; 
&lt;/g&gt;  

<animateTransform xlink:href="#gr1"
attributeName="transform" type="scale" values="0.15;4.5;4.5;0.15;0.15" begin="1s" dur="10s" fill="freeze" begin="1s" restart="whenNotActive" repeatCount="indefinite"/>

</mask> </defs>

<g>
<rect fill="black" width="100%" height="100%" />
<image xlink:href='https://i.stack.imgur.com/xqOMb.jpg' width="100%" height="100%" mask="url(#msk1)"/> </g>

Анимация скольжения трафарета

.container {
  width:100%;
  height:100%;
  }
<svg id="svg1"  xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" viewBox="0 0 640 480">
    <defs>
     <mask id="msk1"> 
  <rect fill="#535353" width="100%" height="100%"  /> 
 <g id="gr1" transform="translate(0 0)" fill="white">
      <rect class="maskid" x='20px'  y='20px' width='100' height='90'></rect>
      <rect class="maskid" x='150px' y='20px' width='100' height='90'></rect>
      <rect class="maskid" x='280px' y='20px' width='100' height='90'></rect>
  &lt;rect class="maskid" x='20px'  y='140px' width='100' height='90'&gt;&lt;/rect&gt;
  &lt;rect class="maskid" x='150px' y='140px' width='100' height='90'&gt;&lt;/rect&gt;
  &lt;rect class="maskid" x='280px' y='140px' width='100' height='90'&gt;&lt;/rect&gt;

  &lt;rect class="maskid" x='20px'  y='260px' width='100' height='90'&gt;&lt;/rect&gt;
  &lt;rect class="maskid" x='150px' y='260px' width='100' height='90'&gt;&lt;/rect&gt;
  &lt;rect class="maskid" x='280px' y='260px' width='100' height='90'&gt;&lt;/rect&gt; 
&lt;/g&gt;  

<animateTransform xlink:href="#gr1"
attributeName="transform" type="translate" values="0 0;100 120; 250 120;250 0;0 120;0 0" begin="1s" dur="4s" fill="freeze" begin="0.5s" restart="whenNotActive" repeatCount="indefinite"/>

</mask> </defs>

<g>
<rect fill="black" width="100%" height="100%" />
<image xlink:href='https://i.stack.imgur.com/xqOMb.jpg' width="100%" height="100%" mask="url(#msk1)"/> </g>

</svg>

Alexandr_TT
  • 110,146
  • 23
  • 114
  • 384