2015-04-21 18 views
16

Le immagini di ritratto, prese da alcuni dispositivi mobili, caricate tramite un modulo HTML ottengono l'orientamento errato mentre sono incorporate in una pagina Web.Ruota le immagini caricate contenenti l'orientamento EXIF ​​in Parse Cloud Code

Ciò è dovuto alle EXIF orientation metadati, che potrebbero ad esempio avere il valore 6 = Rotate 90 CW dire l'immagine da visualizzare con un orientamento specifico. Tuttavia, l'immagine stessa, senza metadati, viene memorizzata lateralmente come immagine orizzontale. A seconda del renderizzatore di immagini, vedrai l'immagine correttamente (come la miniatura di sinistra sotto) o senza i metadati di rotazione applicati (come la miniatura giusta). Per le immagini incorporate nei siti Web, è quest'ultima.

Portrait picture with EXIF orientation Rotate 90 CW, displayed with and without metadata applied

Esiste un modo per ruotare manualmente l'immagine caricata utilizzando Javascript o Node.js, in un codice cloud Parse ospitato web app? (Analizza solo il codice cloud supports a few dependencies - ma puoi ancora caricare piccoli script).

+0

Si potrebbe usare la trasformazione CSS: ruotare (90deg) 'ma è roba CSS3. Non * significa * HTML5 ma un browser che non può gestire html5 probabilmente non gestirà CSS3 – floribon

+0

@floribon. Ciao, il problema è in realtà che voglio modificare il file immagine, cioè salvare una versione ruotata dell'immagine sul mio server. Detto questo, il desiderio di non HTML5 non è così importante, se riesco comunque a trovare una soluzione. – ajgarn

+0

@ajgarn. Sono arrivato a pensare a un hack che è probabilmente davvero inefficiente. Cosa succede se usiamo il modulo Parse Cloud per salvare in png e poi salvare in jpg? Spero che questo possa essere raggiunto abbastanza velocemente anche se .... – Stephane

risposta

0

Ho finito per scrivere una classe lato client per la rotazione e il ridimensionamento delle immagini caricate. Sto usando l'elemento Canvas e FileReader HTML5.

Per il codice sorgente e alcuni esempi, vedere https://github.com/ajgarn/CanvasImageUploader.

La classe fornisce i dati dell'immagine (un BLOB), che possono essere inviati allo Parse's REST API nello stesso modo in cui si sarebbe caricato un file tramite FileReader.

3

Si dovrebbe essere in grado di utilizzare npm moduli in codice nuvola: Using npm modules in cloud code

Una volta che hai che il lavoro, il modulo jpegorientation NPM dovrebbe soddisfare le vostre esigenze:

var jpeg = require('jpegorientation'); 

jpeg.autoRotate('image.jpg', function (err) { 
    // error handler 
}); 

Se non è possibile ottenere il funzionamento dei moduli npm, è sempre possibile includere la libreria manualmente. Se si esegue in problemi con quella biblioteca e il nodo-Gyp, ci sono altri moduli da considerare:

+1

Grazie! Sfortunatamente [jpegorientation] (https://www.npmjs.com/package/jpegorientation) dipende da [gm] (https://www.npmjs.com/package/gm) che ha molte dipendenze. Immagino che includerli in Parse Cloud Code potrebbe essere ingestibile.Ma controllerò sicuramente [exif-ruotare] (https://www.npmjs.com/package/exif-rotate) che aveva solo due dipendenze! – ajgarn

+0

@ajgarn, sto cercando lo stesso, hai trovato una soluzione praticabile? se sì, puoi condividere parte del codice? Grazie mille! – Stephane

+1

@Stephane: Ci dispiace, non ho ancora avuto il tempo di terminare una soluzione. Le esigenze della mia applicazione sono cambiate un po ', quindi potrebbe volerci un po' di tempo in più, ma quando troverò una soluzione, la condividerò! – ajgarn