#html #image #svg
Вопрос:
В настоящее время у меня есть изображение в формате png, где посередине есть пустое синее пространство. эталонное изображение:
Я хочу иметь возможность вставлять другое изображение в синее пространство с помощью html. Одним из решений, о котором я подумал, было создание SVG, но как мне сделать так, чтобы изображение вписывалось в svg. Я не могу использовать абсолютное позиционирование для размещения этих изображений, так как основное изображение с синим пробелом динамически размещается на карте в качестве маркера.
Текущая SVG:
<svg version="1.0" xmlns="http://www.w3.org/2000/svg"
width="85.000000pt" height="109.000000pt" viewBox="0 0 85.000000 109.000000"
preserveAspectRatio="xMidYMid meet">
<metadata>
Created by potrace 1.10, written by Peter Selinger 2001-2011
</metadata>
<g transform="translate(0.000000,109.000000) scale(0.100000,-0.100000)"
fill="#ffff00" stroke="none">
<path d="M390 1061 c-5 -11 -38 -33 -72 -50 -68 -34 -63 -43 6 -11 44 21 109
80 88 80 -6 0 -16 -9 -22 -19z"/>
<path d="M455 1050 c55 -57 178 -99 295 -100 31 0 61 -5 68 -12 9 -9 12 -84
12 -278 0 -340 -1 -344 -114 -455 -76 -75 -182 -146 -265 -178 -27 -10 -37 -8
-88 17 -139 68 -259 167 -312 256 -25 43 -26 52 -32 240 l-6 195 1 -200 c1
-197 1 -201 27 -245 64 -109 300 -280 385 -280 31 0 154 65 229 120 71 52 143
133 166 185 18 40 19 65 17 342 l-3 298 -84 7 c-152 13 -257 47 -288 94 -8 13
-20 24 -26 24 -6 0 2 -14 18 -30z"/>
<path d="M406 1035 c-32 -49 -201 -104 -323 -105 l-43 0 0 -282 c0 -277 1
-284 24 -333 39 -82 146 -174 291 -250 l67 -34 61 31 c151 76 265 170 303 253
23 49 24 57 24 330 l0 281 -103 12 c-124 13 -206 42 -252 87 l-33 34 -16 -24z
m63 -48 c9 -8 33 -20 53 -28 20 -7 35 -16 32 -20 -2 -4 5 -5 16 -2 11 3 20 1
20 -5 0 -5 41 -15 92 -21 51 -7 93 -13 94 -14 1 -1 5 -117 8 -257 5 -187 3
-266 -6 -295 -14 -47 -130 -170 -193 -204 -22 -12 -62 -35 -90 -51 -27 -16
-59 -29 -70 -29 -21 0 -138 58 -120 59 6 0 -9 9 -32 20 -24 10 -43 24 -43 30
0 5 -6 10 -13 10 -7 0 -39 26 -70 57 -43 43 -56 62 -51 77 4 15 3 17 -4 7 -7
-10 -12 -5 -20 20 -13 38 -16 558 -4 561 4 0 19 2 33 3 67 5 135 17 172 31 56
21 127 56 133 65 6 11 44 2 63 -14z"/>
<path d="M228 973 c7 -3 16 -2 19 1 4 3 -2 6 -13 5 -11 0 -14 -3 -6 -6z"/>
<path d="M173 963 c9 -2 23 -2 30 0 6 3 -1 5 -18 5 -16 0 -22 -2 -12 -5z"/>
<path d="M16 944 c-3 -9 -5 -59 -4 -112 l2 -97 3 85 c4 127 5 128 61 133 l47
3 -51 2 c-39 2 -53 -2 -58 -14z"/>
</g>
</svg>
Комментарии:
1. оберните изображение в контейнер, а затем используйте абсолютное позиционирование для второго изображения
2. @Pete Я не могу этого сделать, так как эти изображения динамически размещаются на карте в качестве маркера
3. Конечно, если это маркеры карты, было бы проще создать отдельный значок для каждого типа маркера, а не пытаться подделать какое — то изображение внутри изображения — я не вижу, какую пользу принесет ваш подход-вам все равно нужны отдельные изображения для каждого вторичного изображения
4. Ну, я пытаюсь, чтобы пейзажи каждой страны были встроены в голубое пространство. Не то, что вы действительно можете указать разными значками
Ответ №1:
Я использую часть одного из ваших путей для обрезки изображения.
Я также использую эту часть в <use>
качестве границы.
Наблюдение: хотя я использую часть вашего кода, имеющиеся у вас пути бесполезны для отсечения, так как это в основном пустые пути.
svg{border:solid}
<svg version="1.0" xmlns="http://www.w3.org/2000/svg" width="85.000000pt" viewBox="0 0 850 1090" preserveAspectRatio="xMidYMid meet">
<clipPath id="clip">
<path id="path" transform="translate(0,1090) scale(1,-1)" d="M406 1035 c-32 -49 -201 -104 -323 -105 l-43 0 0 -282 c0 -277 1
-284 24 -333 39 -82 146 -174 291 -250 l67 -34 61 31 c151 76 265 170 303 253
23 49 24 57 24 330 l0 281 -103 12 c-124 13 -206 42 -252 87 l-33 34 -16 -24z" />
</clipPath>
<image x="-200" y="30" width="1090" height="1090" clip-path="url(#clip)" xlink:href="https://assets.codepen.io/222579/darwin300.jpg" />
<use xlink:href="#path" fill="none" stroke="gold" stroke-width="30" />
</svg>
Еще один способ сделать это-использовать изображение в качестве шаблона для заполнения пути.
Пожалуйста, обратите внимание, что в данном случае я использую преобразованное (перевернутое) изображение.
svg{border:solid}
<svg version="1.0" xmlns="http://www.w3.org/2000/svg" width="85.000000pt" viewBox="0 0 850 1090" preserveAspectRatio="xMidYMid meet">
<pattern id="pat" width="1" height="1">
<image x="-200" y="30" width="1090" height="1090" transform="translate(0,1090) scale(1,-1)" xlink:href="https://assets.codepen.io/222579/darwin300.jpg" />
</pattern>
<g transform="translate(0,1090) scale(1,-1)" >
<path id="path" d="M406 1035 c-32 -49 -201 -104 -323 -105 l-43 0 0 -282 c0 -277 1
-284 24 -333 39 -82 146 -174 291 -250 l67 -34 61 31 c151 76 265 170 303 253
23 49 24 57 24 330 l0 281 -103 12 c-124 13 -206 42 -252 87 l-33 34 -16 -24z" fill="url(#pat)"/>
<use xlink:href="#path" fill="none" stroke="gold" stroke-width="30" />
</g>
</svg>