#javascript #svg #canvas
#javascript #svg #холст
Вопрос:
Я создал аватар / создателя персонажей, используя множество SVG-файлов (все одинаковой ширины / высоты, положение: абсолютное), упорядоченных по z-индексу и выбранных с помощью ползунков.
Это работает хорошо, но теперь моя цель — сохранить сглаженную версию выбранных SVG-файлов в формате PNG для сохранения / экспорта. Я изучал теги canvas, но прочитал, что мне нужно будет использовать несколько тегов canvas в качестве слоев, что звучит так, будто я вернусь к исходной точке.
Кто-нибудь может указать мне правильное направление? Я опубликовал фрагмент моего текущего кода для наглядности.
Новичок в JS и SVG и не имеет опыта работы с canvas, поэтому буду признателен за любой совет.
<body>
<div class="image eyes" id="eyesImages">
<img src="parts/eyes/01.svg">
<img src="parts/eyes/02.svg">
<img src="parts/eyes/03.svg">
</div>
<div class="image nose" id="noseImages">
<img src="parts/nose/01.svg">
<img src="parts/nose/02.svg">
<img src="parts/nose/03.svg">
</div>
<div class="image mouth" id="mouthImages">
<img src="parts/mouth/01.svg">
<img src="parts/mouth/02.svg">
<img src="parts/mouth/03.svg">
</div>
<div class="sliders">
<div id="slider1">
<label for="slider1">Eyes</label>
<input type="range" min="1" max="50" value="1" class="slider" id="sliderEyes">
</div>
<div id="slider2">
<label for="slider2">Nose</label>
<input type="range" min="1" max="50" value="1" class="slider" id="sliderNose">
</div>
<div id="slider3">
<label for="slider3">Mouth</label>
<input type="range" min="1" max="50" value="1" class="slider" id="sliderMouth">
</div>
</div>
<script type="text/javascript">
window.addEventListener('load', function() {
var slider1 = document.getElementById("sliderEyes");
var images = document.getElementById("eyesImages");
slider1.addEventListener('input', function() {
for (var i = 0; i < images.children.length; i ) {
images.children[i].style.display = 'none';
}
i = Number(this.value) - 1;
images.children[i].style.display = 'block';
});
});
window.addEventListener('load', function() {
var slider2 = document.getElementById("sliderNose");
var images = document.getElementById("noseImages");
slider2.addEventListener('input', function() {
for (var i = 0; i < images.children.length; i ) {
images.children[i].style.display = 'none';
}
i = Number(this.value) - 1;
images.children[i].style.display = 'block';
});
});
window.addEventListener('load', function() {
var slider3 = document.getElementById("sliderMouth");
var images = document.getElementById("mouthImages");
slider3.addEventListener('input', function() {
for (var i = 0; i < images.children.length; i ) {
images.children[i].style.display = 'none';
}
i = Number(this.value) - 1;
images.children[i].style.display = 'block';
});
});
</script>
</body>
Спасибо
Комментарии:
1. Вам нужен только один холст. Установите его разрешение с помощью
canvas,width
иheight
свойств (не значений CSS) и рисуйте SVG-изображения по очереди снизу вверх, используя 2D контекстdrawImage(SVGImage, x, y);
на одном холсте. Затем вы можете сохранить в виде одного PNG или JPG. информация о контексте 2D-рендеринга и многое другое на developer.mozilla.org/en-US/docs/Web/API /…
Ответ №1:
Хорошо, я случайно исправил, и это работает…
Поскольку изображения управляются ползунками диапазона, я превратил их в форму и перенес значения с помощью POST на submit на другую страницу с элементом canvas. Я определил значения формы как переменные и вставил их динамически с помощью PHP, чтобы нарисовать плоское изображение с соответствующими числовыми именами файлов, с которыми теперь я могу играть по мере необходимости.
Однако, если у кого-нибудь есть более сексуальное решение, пожалуйста, не стесняйтесь поделиться. Спасибо.
Ответ №2:
Вы можете попробовать dom в библиотеку изображений или html2canvas
Вот пример html2canvas на их уважительном веб-сайте https://html2canvas.hertzen.com