2011-03-02 32 views
11

Ho questo script, è usato per recuperare la larghezza e l'altezza dell'immagine caricata dal browser.HTML5 - come ottenere la dimensione dell'immagine

di riferimento: http://renevier.net/misc/resizeimg.html

function createReader(file) { 
    reader.onload = function(evt) { 
     var image = new Image(); 
     image.onload = function(evt) { 
      var width = this.width; 
      var height = this.height; 
      alert (width); // will produce something like 198 
     }; 
     image.src = evt.target.result; 
    }; 
    reader.readAsDataURL(file); 
} 

for (var i = 0, length = input.files.length; i < length; i++) { 
    createReader(input.files[i]); 
} 

voglio accedere la larghezza e l'altezza dal valore di fuori della funzione createReader. Come lo posso fare?

+1

um ... avere 'createReader' restituire qualcosa. È un buon inizio. –

+0

la larghezza e l'altezza di var possono accedere solo all'interno della funzione image.onload, ecco perché non è stato possibile "restituire qualcosa" –

+0

Non è possibile creare le variabili 'width' e' height' nello scope in cui si desidera restituirle , come la funzione 'createReader'? –

risposta

26

Change "createReader" in modo che si passa in una funzione di gestore da chiamare quando l'immagine è disponibile:

function createReader(file, whenReady) { 
    reader.onload = function(evt) { 
     var image = new Image(); 
     image.onload = function(evt) { 
      var width = this.width; 
      var height = this.height; 
      if (whenReady) whenReady(width, height); 
     }; 
     image.src = evt.target.result; 
    }; 
    reader.readAsDataURL(file); 
} 

Ora, quando lo si chiama, si può passare in una funzione di fare tutto ciò che è si vuoi fatto con le dimensioni dell'immagine:

createReader(input.files[i], function(w, h) { 
    alert("Hi the width is " + w + " and the height is " + h); 
    }); 
+0

risposta fantastica. se posso dare 10 upvotes, lo farei !! The WhenReady mi ha davvero aiutato perché non sapevo perché a volte il recupero dell'altezza funzionava e talvolta no. Qualsiasi ulteriore spiegazione su quando utilizzare un gestore di tipo whenReady. E perché richiede la lettura del file utilizzando File API? –

+1

@kimsia molte API come questa sono ** asincrone ** - quando le chiami, una sequenza di eventi viene messa in moto, ma non succede immediatamente. Il meccanismo di "callback" consente di inserire il codice da eseguire quando viene completata un'operazione a lungo termine. Le operazioni di rete, le interazioni tra file system e altre cose simili sono asincrone perché tali cose coinvolgono realtà hardware non immediate. – Pointy

Problemi correlati