Я сделал несколько изменений в вашем скрипте.потому что вам нужно нарисовать изображение несколько раз, я написал функцию, которая рисует изображение.Холст очищается каждый раз, когда один из двух вводимых текстов меняет свое значение, и каждый раз, когда вам нужно все перерисовать.
Также textT и textB могут быть объявлены только один раз.Вам не нужно объявлять их в функции Text.
Мне нужно использовать размер шрифта (60) более одного раза, поэтому я создал переменную fontSize = 60
Так какВы не знаете размер вашего холста (зависит от размера загружаемого изображения), вам нужно вычислить позицию для нижнего текста textB = height - fontSize/2
, где высота - высота холста: height = canvas.height = img.height;
Надеюсь, это полезно.
var canvas = document.getElementById("meme-canvas");
var ctx = canvas.getContext("2d");
var width = (canvas.width = 400);
var height = (canvas.height = 400);
var fontSize = 60;
var img = new Image();
var textT = document.getElementById("top-text");
var textB = document.getElementById("bottom-text");
function readImage() {
if (this.files && this.files[0]) {
var FR = new FileReader();
FR.onload = function(e) {
img.addEventListener("load", function() {
width = canvas.width = img.width;
height = canvas.height = img.height;
drawImage();
});
img.src = e.target.result;
};
FR.readAsDataURL(this.files[0]);
}
}
function drawImage() {
ctx.drawImage(img, 0, 0);
}
function Text() {
ctx.font = fontSize + "px Impact";
ctx.textAlign = "center";
ctx.lineWidth = 3;
ctx.clearRect(0, 0, width, height);
drawImage();
ctx.strokeText(textT.value, width / 2, 65);
ctx.strokeText(textB.value, width / 2, height - fontSize/2);
}
document
.getElementById("image-input")
.addEventListener("change", readImage, false);
textT.addEventListener("input", Text);
textB.addEventListener("input", Text);
canvas{position: absolute; left: 10px; top:60px;border:1px solid #d9d9d9;}
<input type="file" id="image-input" accept="image/*">
<input type="text" id="top-text" />
<input type="text" id="bottom-text" />
<canvas style="" id="meme-canvas"></canvas>