JS Côté Client, l'Orientation Exif: Rotation et Miroir des Images JPEG
Appareil photo numérique photos sont souvent enregistrés au format JPEG avec une EXIF "orientation" de la balise. Pour afficher correctement les images ont besoin d'être tourné/miroir en fonction de l'orientation qui est en jeu, mais les navigateurs ignorer cette information de rendu de l'image. Même dans les grandes commercial d'applications web, de soutien pour l'orientation EXIF peuvent être inégale Un. La même source a également fournit un bon résumé de la 8 orientations différentes un JPEG peut avoir:
Des échantillons d'images sont disponibles à Quatre.
La question est de savoir comment tourner/miroir l'image sur le côté client de sorte qu'il affiche correctement et peuvent être traitées ultérieurement si nécessaire?
Il y a des bibliothèques JS disponibles pour analyser les données EXIF, y compris l'orientation de l'attribut Deux. Flickr a noté possible problème de performance lors de l'analyse d'images de grande taille, exigeant l'utilisation des web workers Trois.
Outils de la Console correctement ré-orienter les images Cinq. Un script PHP pour résoudre le problème est disponible à Six
Vous devez vous connecter pour publier un commentaire.
Le projet github JavaScript-Charge-Image fournit une solution complète pour l'orientation EXIF problème, correctement rotation/mise en miroir des images pour tous les 8 exif orientations. Voir la démo en ligne de javascript orientation exif
L'image est dessinée sur un HTML5 canvas. Son rendu correct est mis en œuvre dans js/load-image-orientation.js à travers canevas des opérations.
Espère que cela sauve quelqu'un d'autre peu de temps, et enseigne les moteurs de recherche sur l'open source bijou 🙂
canvas.toDataURL()
et de décoder et de les enregistrer côté serveur.<img>
tag?Mederr du contexte de transformation fonctionne parfaitement. Si vous avez besoin d'extraire de l'orientation utilisez uniquement cette fonction - vous n'avez pas besoin de tout EXIF-lecture libs. Ci-dessous est une fonction de re-réglage de l'orientation en base64 de l'image.
Voici un violon pour elle. J'ai également préparé un jouer avec l'orientation de l'extraction de démonstration.
switch
n'est pas nécessaire, étant donné que la transformation ne pas faire n'importe quoi. Aussi, pensez à utilisersrcOrientation > 4 && srcOrientation < 9
au lieu de[5,6,7,8].indexOf(srcOrientation) > -1
, parce que c'est plus rapide et moins gourmande en ressources (mémoire vive (RAM) & CPU). Il n'y a pas besoin d'avoir un tableau il. Ceci est important lors du traitement par lots les lots d'images, où chaque nombre de bits. Sinon, assez bonne réponse. Upvoted!indexOf
être en le comparant à ce que vous avez proposé. J'ai couru une simple boucle avec 10M d'itérations et il était de 1400% plus rapide. Nice 😀 Merci beaucoup!getOrientation
, je suis curieux de savoir si c'est efficace en termes de performances.getOrientation
appelsfileReader.readAsArrayBuffer
, et ensuite, nous appelonsURL.createObjectURL
et passer le résultat dansresetOrientation
, qui charge cette URL de l'image. Est-ce à dire que le fichier image sera "chargé"/lu par le navigateur, pas une fois mais deux fois, ou de faire que j'ai mal compris?image-orientation: from-image
lorsqu'il est utilisé.Si
Vous pouvez ensuite utiliser ces transformations pour tourner l'image à l'orientation 1
De
orientation:
ctx.transform(1, 0, 0, 1, 0, 0);
ctx.transform(-1, 0, 0, 1, width, 0);
ctx.transform(-1, 0, 0, -1, width, height);
ctx.transform(1, 0, 0, -1, 0, height);
ctx.transform(0, 1, 1, 0, 0, 0);
ctx.transform(0, 1, -1, 0, height, 0);
ctx.transform(0, -1, -1, 0, height, width);
ctx.transform(0, -1, 1, 0, 0, width);
Avant de dessiner l'image sur ctx
ok en plus de @user3096626 de la réponse, je pense que cela sera plus utile si quelqu'un a le code fourni par l'exemple, l'exemple suivant va vous montrer comment résoudre orientation d'image vient de l'url (images à distance):
Solution 1: utilisation de javascript (recommandé)
parce que charge de l'image de bibliothèque n'a pas d'extraire les données exif à partir de l'url des images uniquement (fichier/blob), nous allons utiliser les deux exif-js et charge-image bibliothèques javascript, donc tout d'abord ajouter ces bibliothèques à votre page que le suivi:
Note la version 2.2 de l'exif-js semble avoir des problèmes, donc nous avons utilisé 2.1
puis, fondamentalement, ce que nous allons faire est de
a - charger l'image à l'aide de
window.loadImage()
b - lire les exif des étiquettes à l'aide de
window.EXIF.getData()
c - convertir l'image sur la toile et de fixer l'orientation d'image à l'aide de
window.loadImage.scale()
d - place de la toile dans le document
ici, vous allez 🙂
bien sûr, vous pouvez également obtenir l'image en base64 de la toile de l'objet et de le placer dans le img src attribut, donc, à l'aide de jQuery que vous pouvez faire 😉
voici le code complet sur: github: https://github.com/digital-flowers/loadimage-exif-example
Solution 2: à l'aide de html (navigateur hack)
il est très rapide et facile hack, la plupart des navigateurs d'afficher l'image dans la bonne orientation si l'image s'ouvre dans un nouvelle onglet directement, sans aucun html (LOL je ne sais pas pourquoi), donc, fondamentalement, vous pouvez afficher votre image à l'aide d'une iframe en mettant l'attribut src de l'iframe que l'url de l'image directement:
Solution 3: à l'aide de css (seulement firefox & safari sur ios)
il est css3 attribut de fixer l'image de l'orientation, mais le problème, il ne fonctionne que sur firefox et safari/ios, il est toujours utile de le mentionner car bientôt il sera disponible pour tous les navigateurs (Browser support info de caniuse)
<input type="file" name="file" id="select-image" accept="image/*">
Pour ceux qui ont un fichier à partir d'un contrôle d'entrée, je ne sais pas ce que son orientation est, sont un peu paresseux et ne veulent pas d'inclure une grande bibliothèque ci-dessous est le code fourni par @WunderBart fusionné avec la réponse qu'il a des liens vers d' (https://stackoverflow.com/a/32490603) qui détecte l'orientation.
qui peut facilement être appelé comme tel
image/jpeg
au lieu de la valeur par défautimage/png
, et le redimensionnement de l'image de sortie pour une largeur maximale (400px dans mon cas) fait une énorme différence. (cela fonctionne bien pour les miniatures, mais si vous avez pour afficher l'image complète, je vous conseille d'éviter base64 et simplement injecter de l'élément canvas directement dans la page...)WunderBart réponse était le meilleur pour moi. Notez que vous pouvez l'accélérer beaucoup si vos images sont souvent le droit chemin, tout simplement en testant l'orientation première et en contournant le reste du code, si pas de rotation est nécessaire.
En mettant toutes les infos de wunderbart ensemble, quelque chose comme cela;
-2
et-1
retour degetOrientation
de sorte que vous n'essayez pas de tourner non-jpg ou des images sans rotation de données.file.slice()
d'optimisation, mais le véritable coup de fouet vient de l'utilisation des images plus petites etimage/jpeg
format de sortie pour créer les plus petits des données d'Url. (il n'y a pas de retard notable, même pour 10 mégapixels images.)file.slice()
, comme vous vous en prévenir l'appui de base64 les sources d'image.Un paquebot tout le monde?
Je n'ai vu personne parler de la
navigateur de compression d'image
de la bibliothèque. Il a une fonction d'assistance parfaite pour ça.Utilisation:
const orientation = await imageCompression.getExifOrientation(file)
Un outil utile dans de nombreuses autres façons aussi.
File
objets autant que je sache. La prochaine meilleure chose serait d'envoyer l'image et de l'orientation au serveur, et faire de manipulation de fichiers là. Ou vous pouvez générer un base64 chaîne à l'aide decanvas
et latoDataURL
méthode.Je suis en utilisant la solution mixte (php+css).
Conteneurs sont nécessaires pour:
div.imgCont2
contenant nécessaire pour le faire tourner;div.imgCont1
conteneur nécessaires pour zoomOut -width:150%
;div.imgCont
conteneur nécessaires pour les barres de défilement lorsque l'image est zoomOut..
En plus de @fareed namrouti réponse,
Ce doit être utilisée si l'image doit être parcourue à partir d'un fichier d'entrée de l'élément de
J'ai écrit un petit script php qui fait pivoter l'image. Assurez-vous de stocker l'image en faveur de seulement recalculer à chaque demande.
Acclamations