Я стараюсь выполнить и понять следующий «monstercode», который я написал. В принципе, эта функция должна срабатывать при запуске диалогового окна ввода файла (HTML). Но код подходит только для нескольких строк. Он загружает изображение, а затем в первый alert()
он показывает мне base64 исходного изображения, но затем, позже в коде, когда фактическое изображение должно быть загружено в холст, оно возвращает (в другом alert()
) height 0
, вероятно, означает, что изображение загружено неправильно или вообще не загружено.Показать изменение размера Base64 вывод изображения
Форма HTML вход (упрощенный) выглядит следующим образом:
<input type='File' accept='image/*' onChange='changeBtn(this);' />
и функция ниже:
function changeBtn(elem) {
selfile = document.getElementById(elem.id);
if ('files' in selfile) {
var file = selfile.files[0];
if ('name' in file) {
str1 = file.name;
}
if ('size' in file) {
str1 += ' (' + ((file.size/1024)/1024).toFixed(2) + 'MB)';
}
document.getElementById("label_" + elem.id).innerHTML = str1;
var FR= new FileReader();
var img = document.createElement("img");
FR.onload = function(e) {
img.src = e.target.result;
alert(e.target.result); // Returns B64 of the original image
};
FR.readAsDataURL(file);
var canvas = document.createElement('canvas');
var ctx = canvas.getContext("2d");
ctx.drawImage(img, 0, 0);
var MAX_WIDTH = 800;
var MAX_HEIGHT = 600;
var width = img.width;
var height = img.height;
alert(height); // Returns 0
if (width > height) {
if (width > MAX_WIDTH) {
height *= MAX_WIDTH/width;
width = MAX_WIDTH;
}
} else {
if (height > MAX_HEIGHT) {
width *= MAX_HEIGHT/height;
height = MAX_HEIGHT;
}
}
canvas.width = width;
canvas.height = height;
var ctx = canvas.getContext("2d");
ctx.drawImage(img, 0, 0, width, height);
var dataurl = canvas.toDataURL("image/png");
alert(dataurl); // Returns only "data; " and nothing more
}
}
Заранее спасибо за любую помощь. Кажется довольно простым, но я не понимаю. Я переписал код как минимум 3 раза, но получаю всегда тот же результат.
Проверьте область видимости 'img'. Вы определяете его, а затем используете его вне 'onload', где он все еще пуст. –
@ J.Titus Но когда я помещаю все внутри нагрузки, нагрузка, похоже, никогда не заканчивается .. (Он не показывает никаких предупреждений) – Fusseldieb
Это не проблема. Вы вызываете 'FR.readAsDataURL (файл);' который будет завершен, вызывая обратный вызов для загрузки. Однако 'FR.readAsDataURL (файл);' немедленно возвращается и продолжает выполнять ваш код, независимо от того, установлена ли переменная 'img' или нет. Если вы переместите весь код, следующий за файлом FR.readAsDataURL (файл); 'внутри onload, он должен работать. Возможно, это не лучший способ сделать это, но это начало. – markbernard