2013-03-10 9 views
10

Sto scrivendo un'applicazione mobile multipiattaforma utilizzando phonegap, e ho un input di caricamento file per il caricamento di immagini di singole immagini.Riduci l'immagine prima di caricarla con javascript

Il problema è che la maggior parte delle immagini che vengono caricate sono quelle prese con il telefono cellulare che sono circa 4 MB di dimensioni.

Desidero ridurre drasticamente queste immagini, in quanto non ne ho affatto bisogno.

Inoltre, ho bisogno di convertirli in base64 e non nel file immagine reale. (Che ho già utilizzato FileReader)

Qualche idea su come raggiungere questo obiettivo? Forse usando la tela o qualcosa del genere?

Aggiornamento: ecco ciò che ho finora:

function shrink() { 
    var self = this; 

    var reader = new FileReader(); // init a file reader 
    var file = $('#file-input').prop('files')[0]; // get file from input 

    reader.onloadend = function() { 

     // shrink image 
     var image = document.createElement('img'); 
     image.src = reader.result; 

     var canvas = document.createElement('canvas'); 
     var ctx = canvas.getContext('2d'); 
     ctx.drawImage(image, 0, 0, 300, 300); 
     var shrinked = canvas.toDataURL('image/jpeg'); 
     console.log(shrinked); 
    }; 

    reader.readAsDataURL(file); // convert file to base64*/ 
} 

ma tutto quello che ottiene è un'immagine in bianco Grazie

+1

http: // StackOverflow .com/questions/2434458/image-resizing-client-side-with-javascript-before-upload-to-the-server (che porta a http://hacks.mozilla.org/2011/01/how-to- develop-a-html5-image-uploader /) – Sygmoral

+0

aggiornato nel post – shaharmor

risposta

2

trovato la risposta.

Il problema era che non stavo aspettando che l'immagine si carichi completamente prima di disegnarla.

una volta ho aggiunto

image.onload = function() { 

} 

e corse tutto dentro funziona.

+0

dov'era questo in relazione al resto del codice? – Zairja

1

So che questo un vecchio thread, ma ho avuto la stessa domanda su dove posizionare il "sotto carico", e questo ha funzionato per me ...

 navigator.camera.getPicture(function (imageURI) { 
      console.log("*** capture success. uri length...", imageURI.length);    
      var image = document.createElement('img'); 
      image.onload = function() { 
       var canvas = document.createElement('canvas'); 
       var ctx = canvas.getContext('2d'); 
       ctx.drawImage(image, 0, 0, 300, 300); 
       var shrunk = canvas.toDataURL('image/jpeg'); 
       console.log(shrunk); 
       // used shrunk here 
      } 
      image.src = imageURI; // triggers the onload 
     }   

pat