2015-06-23 3 views
1

Я довольно новыми для JavaScript и не могу получить мою голову вокруг вопроса последующей совместимости браузера:Загрузка изображения на холст из локальной файловой системы предварительного загрузить

Следующие прекрасно работает в Chrome, IE и Opera (еще не пробовала сафари), но отказывается работать в Firefox. Я искал hi и low для объектов и свойств, которые не поддерживаются в Firefox, которые я вызывал, но не могу найти.

Во всяком случае, вот код:

<input type='file' accept='image/*' onchange='loadImg(event)'><br> 
<canvas id="myCanvas" width="200" height="200" style="border:1px solid #000000;"></canvas><br> 
<button type="button">Upload</button><br> 

<script> 
var loadImg = function(event) { 
    var input = event.target; 

    var reader = new FileReader(); 
    reader.readAsDataURL(input.files[0]); 

    reader.onloadend = function() { 
     var dataURL = reader.result; 
     var output = document.getElementById('myCanvas'); 
     var context = output.getContext('2d'); 
     var imageObj = new Image(); 
     imageObj.src = dataURL; 
     context.drawImage(imageObj,1,1,198,198); 
    }  
} 
</script> 
+0

какой выход? Пожалуйста, уточните ... – n00dl3

+0

Вывод состоит в том, чтобы вывести выбранное изображение из файловой системы в элемент холста на странице перед загрузкой на сервер в качестве аватара для профилей пользователей. Для этого вы должны игнорировать кнопку загрузки. – matthewobrn

ответ

0

Это потому, что изображение не загружается еще, когда вы рисуете его на холсте. Вы можете сделать это следующим образом:

<input type='file' accept='image/*' onchange='loadImg(event)'><br> 
<canvas id="myCanvas" width="200" height="200" style="border:1px solid #000000;"></canvas><br> 
<button type="button">Upload</button><br> 

<script> 
var loadImg = function(event) { 
    var output = document.getElementById('myCanvas'); 
    var context = output.getContext('2d'); 
    var input = event.target; 
    var reader = new FileReader(); 
    reader.onload = function() { 
     var dataURL = reader.result; 
     var imageObj = new Image(); 
     imageObj.src = dataURL; 
     imageObj.onload=function(){ 
      context.drawImage(imageObj,1,1,198,198); 
     } 
    } 
    reader.readAsDataURL(input.files[0]); 


} 
</script> 

imageObj.onload обратного вызова будет выполняться при загрузке изображения. Кажется, что firefox не загружает сразу данные-uri-изображения, тогда как хром делает ...

+0

Спасибо за помощь. Я ценю это. Поэтому, чтобы избежать этого в будущем, можете ли вы рассказать мне о различиях, я вижу, что вы очищаете холст до его перерисовки, вы также добавили новую функцию imageObj.onload =(). Я не понимаю цели этого. Еще раз спасибо. – matthewobrn

+0

важной частью является 'imageObj.onload = function() {...}' другие - это просто вещи, которые я добавил, чтобы попробовать ваш код, обработчик onload запускается при загрузке изображения и поэтому визуализирует холст. – n00dl3

+0

Вам действительно не нужно чистить холст здесь, я собираюсь отредактировать ... – n00dl3

Смежные вопросы