Si vous ne voulez que la balise d'orientation et rien d'autre et que vous n'aimez pas inclure une autre énorme bibliothèque javascript, j'ai écrit un petit code qui extrait la balise d'orientation le plus rapidement possible (il utilise DataView et readAsArrayBuffer
qui sont disponibles dans IE10 +, mais vous pouvez écrire votre propre lecteur de données pour les anciens navigateurs):
function getOrientation(file, callback) {
var reader = new FileReader();
reader.onload = function(e) {
var view = new DataView(e.target.result);
if (view.getUint16(0, false) != 0xFFD8)
{
return callback(-2);
}
var length = view.byteLength, offset = 2;
while (offset < length)
{
if (view.getUint16(offset+2, false) <= 8) return callback(-1);
var marker = view.getUint16(offset, false);
offset += 2;
if (marker == 0xFFE1)
{
if (view.getUint32(offset += 2, false) != 0x45786966)
{
return callback(-1);
}
var little = view.getUint16(offset += 6, false) == 0x4949;
offset += view.getUint32(offset + 4, little);
var tags = view.getUint16(offset, little);
offset += 2;
for (var i = 0; i < tags; i++)
{
if (view.getUint16(offset + (i * 12), little) == 0x0112)
{
return callback(view.getUint16(offset + (i * 12) + 8, little));
}
}
}
else if ((marker & 0xFF00) != 0xFF00)
{
break;
}
else
{
offset += view.getUint16(offset, false);
}
}
return callback(-1);
};
reader.readAsArrayBuffer(file);
}
// usage:
var input = document.getElementById('input');
input.onchange = function(e) {
getOrientation(input.files[0], function(orientation) {
alert('orientation: ' + orientation);
});
}
<input id='input' type='file' />
valeurs:
-2: not jpeg
-1: not defined
Pour ceux qui utilisent Typescript, vous pouvez utiliser le code suivant:
export const getOrientation = (file: File, callback: Function) => {
var reader = new FileReader();
reader.onload = (event: ProgressEvent) => {
if (! event.target) {
return;
}
const file = event.target as FileReader;
const view = new DataView(file.result as ArrayBuffer);
if (view.getUint16(0, false) != 0xFFD8) {
return callback(-2);
}
const length = view.byteLength
let offset = 2;
while (offset < length)
{
if (view.getUint16(offset+2, false) <= 8) return callback(-1);
let marker = view.getUint16(offset, false);
offset += 2;
if (marker == 0xFFE1) {
if (view.getUint32(offset += 2, false) != 0x45786966) {
return callback(-1);
}
let little = view.getUint16(offset += 6, false) == 0x4949;
offset += view.getUint32(offset + 4, little);
let tags = view.getUint16(offset, little);
offset += 2;
for (let i = 0; i < tags; i++) {
if (view.getUint16(offset + (i * 12), little) == 0x0112) {
return callback(view.getUint16(offset + (i * 12) + 8, little));
}
}
} else if ((marker & 0xFF00) != 0xFF00) {
break;
}
else {
offset += view.getUint16(offset, false);
}
}
return callback(-1);
};
reader.readAsArrayBuffer(file);
}
Vous pouvez utiliser les exif-js bibliothèque en combinaison avec l'API de fichier HTML5: http://jsfiddle.net/xQnMd/1/ .
la source
Firefox 26 prend en charge
image-orientation: from-image
: les images sont affichées en portrait ou en paysage, selon les données EXIF. (Voir sethfowler.org/blog/2013/09/13/new-in-firefox-26-css-image-orientation .)Il existe également un bug pour implémenter cela dans Chrome .
Attention, cette propriété n'est prise en charge que par Firefox et est susceptible d'être obsolète .
la source
https://github.com/blueimp/JavaScript-Load-Image est une bibliothèque javascript moderne qui peut non seulement extraire l'indicateur d'orientation exif - elle peut également refléter / faire pivoter correctement les images JPEG du côté client.
Je viens de résoudre le même problème avec cette bibliothèque: Orientation Exif côté client JS: Rotation et miroir des images JPEG
la source
Si vous le souhaitez sur plusieurs navigateurs, le mieux est de le faire sur le serveur. Vous pourriez avoir une API qui prend une URL de fichier et vous renvoie les données EXIF; PHP a un module pour cela .
Cela pourrait être fait en utilisant Ajax afin que ce soit transparent pour l'utilisateur. Si vous ne vous souciez pas de la compatibilité entre navigateurs et que vous pouvez compter sur la fonctionnalité de fichier HTML5 , regardez dans la bibliothèque JsJPEGmeta qui vous permettra d'obtenir ces données en JavaScript natif.
la source
Découvrez un module que j'ai écrit (vous pouvez l'utiliser dans le navigateur) qui convertit l'orientation exif en transformation CSS: https://github.com/Sobesednik/exif2css
Il existe également ce programme de nœuds pour générer des fixtures JPEG avec toutes les orientations: https://github.com/Sobesednik/generate-exif-fixtures
la source
Je télécharge le code d'extension pour montrer la photo par appareil photo Android sur html comme d'habitude sur une balise img avec rotation droite, en particulier pour la balise img dont la largeur est plus large que la hauteur. Je sais que ce code est moche mais vous n'avez pas besoin d'installer d'autres packages. (J'ai utilisé le code ci-dessus pour obtenir la valeur de rotation exif, merci.)
puis utilisez comme
la source
Améliorer / ajouter plus de fonctionnalités à la réponse d'Ali précédemment, j'ai créé une méthode util dans Typescript qui répondait à mes besoins pour ce problème. Cette version renvoie la rotation en degrés dont vous pourriez également avoir besoin pour votre projet.
Usage:
la source