Как сделать такую фигуру с помощью маски css?

Подскажите, возможно ли сделать такую маску на css чтобы в дальнейшем можно было вставить любое фото введите сюда описание изображения


Ответы (2 шт):

Автор решения: Alexandr_TT

Подскажите, возможно ли сделать такую маску на css чтобы в дальнейшем можно было вставить любое фото

Другими словами нужно не вставить фото, а обрезать его по заданному криволинейному шаблону. В CSS обрезку изображения выполняет не маска,
а clip-path

Создать криволинейный шаблон в CSS для clip-path проблематично и трудо затратно.
Но с этой задачей легко справится SVG

В векторном редакторе создаете криволинейный шаблон (path) по заданному образцу:

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

И далее с помощью SVG mask вырезаете фрагмент изображения:

.img {
mask:url(#msk);
} 
.container {
width:50vw;
height:50vh;
}
<div class="container">
<svg id="svg1" xmlns="http://www.w3.org/2000/svg"  xmlns:xlink="http://www.w3.org/1999/xlink" 
 viewBox="0 0 760 860" version="1.1"  style="border:0px solid red">
 <mask id="msk" > 
 
   <path id="p1"   fill="white" d="M45.6 798C20.3 722.3 20 630.9 12.8 546.7c-4.6-52.3-6-105-7.1-157.4C4.6 338.4 3.3 289 5.9 237 9.5 165 9.5 50 71.1 31 122.8 0 194 1.7 249.6 1.8c18.7 1 37.1 4.6 55.7 6.6 13.3 1.4 26.6 3.2 40 3.9 19.7.9 39.5 1 59.2 0 33.7-2 66.9-9.7 100.5-11.6 19.3-1.2 38.7-.7 58 0 19 .6 38.1.2 56.7 3.8 22.7 4.5 47 8.3 65.7 22C706.6 41.8 721.4 66 732 90c14.5 32.7 17.6 69.6 21.7 105.2 6.9 59.5 4.8 119.8 4.8 179.8 0 54.5-.8 110.4-4.2 163.4-2 31.9-3.6 63.8-5.4 95.7-1.8 30.3-2.4 60.8-5.5 91 1 51.4-21.5 89-76.5 107.6-44.8 17.3-94.2 21-142.2 23.7-52.5 3-105-7.6-157.6-8.2-54.3-.7-109.7.8-163 4.5-23.7 1.7-63.8 10.6-93 0-26.7-9.7-56.6-27.6-65.5-54.6z" > 
  </path>
</mask> 

 <image class="img"  xlink:href="https://i.sstatic.net/rU0Ewb7k.png" width="100%" height="100%" /> 
</svg>  
</div>

→ Ссылка
Автор решения: Leonid

Создаем в Кореле кривую следующей формы и сохраняем как .png и .svg. Это замкнутая фигура, залитая черным.

Маска для фотографии

Затем указываем файл png в качестве маски через css:

img {
    mask: url(https://i.sstatic.net/cWUEWhKg.png);
    mask-size: cover;
}
<img src="https://i.sstatic.net/iDgYDYj8.png">

Либо указываем svg такого простого вида в качестве маски. Здесь приведен "текст файла" svg (куда-то загрузить его в качестве внешнего файла для ответа не удалось). Но результат будет такой же, но с четкими границами.

img {
  mask: url(./mask.svg);
  mask-size: cover;
}
<svg xmlns="http://www.w3.org/2000/svg" width="350px" height="400px" viewBox="0 0 350 400">

  <path d="M37.76 19.02c41.72,-33.16 86.23,-12.77 137.24,-13.3 51.01,0.53 95.52,-19.86 137.24,13.3 36.14,28.72 42.24,90.93 35.19,193.44 -7.31,106.24 -16.44,121.99 -48.36,160.59 -14.77,17.86 -64.62,28.52 -124.07,26.76 -59.46,1.76 -109.3,-8.9 -124.07,-26.76 -31.92,-38.6 -41.05,-54.35 -48.36,-160.59 -7.05,-102.51 -0.95,-164.72 35.19,-193.44z"/>

</svg>

С помощью mask-position и mask-size выставляете маску по центру, например, и на нужный размер. И получается универсальная маска для фотографий, сколько бы их не было.

UPD. Можно из текста svg создать URL и назначить mask-image. Это больше для имитации работы внешнего svg-файла в качестве маски:

const svg = `<svg id="mask" xmlns="http://www.w3.org/2000/svg" width="350px" height="400px" viewBox="0 0 350 400">

<path d="M37.76 19.02c41.72,-33.16 86.23,-12.77 137.24,-13.3 51.01,0.53 95.52,-19.86 137.24,13.3 36.14,28.72 42.24,90.93 35.19,193.44 -7.31,106.24 -16.44,121.99 -48.36,160.59 -14.77,17.86 -64.62,28.52 -124.07,26.76 -59.46,1.76 -109.3,-8.9 -124.07,-26.76 -31.92,-38.6 -41.05,-54.35 -48.36,-160.59 -7.05,-102.51 -0.95,-164.72 35.19,-193.44z"/>

</svg>`;

const svg_url = `data:image/svg+xml;base64,${btoa(svg)}`;

document.getElementById('photo').style.maskImage = `url(${svg_url})`;
img {
    mask-size: cover;
}
<img id="photo" src="https://i.sstatic.net/iDgYDYj8.png">

→ Ссылка