2016-10-31 10 views
0

Я стараюсь выполнить и понять следующий «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 раза, но получаю всегда тот же результат.

+0

Проверьте область видимости 'img'. Вы определяете его, а затем используете его вне 'onload', где он все еще пуст. –

+0

@ J.Titus Но когда я помещаю все внутри нагрузки, нагрузка, похоже, никогда не заканчивается .. (Он не показывает никаких предупреждений) – Fusseldieb

+0

Это не проблема. Вы вызываете 'FR.readAsDataURL (файл);' который будет завершен, вызывая обратный вызов для загрузки. Однако 'FR.readAsDataURL (файл);' немедленно возвращается и продолжает выполнять ваш код, независимо от того, установлена ​​ли переменная 'img' или нет. Если вы переместите весь код, следующий за файлом FR.readAsDataURL (файл); 'внутри onload, он должен работать. Возможно, это не лучший способ сделать это, но это начало. – markbernard

ответ

1

Выяснил это! Прежде чем загружать изображение в него, я вызывал FR.readAsDataURL(file);, заставляя его загружать undefined файл.

Если мы посмотрим на следующий код, который не удалось:

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 FR= new FileReader();, затем FR.readAsDataURL(file);, а затем, наконец, когда срабатывает пожар: img.src = e.target.result;. Это неправильный порядок. Правильный заказ:

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(); 

     FR.readAsDataURL(file); 

     var img = document.createElement("img"); 
     FR.onload = function(e) { 
      img.src = e.target.result; 
      alert(e.target.result); 

      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); 

      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); 
     }; 
    } 
} 
+2

Хорошая работа. Не забудьте принять свой собственный ответ. – markbernard

+0

Я сделаю это в ближайшее время, я просто исправляю некоторые незначительные орфографические ошибки в своем ответе. :) – Fusseldieb