Si solo desea la etiqueta de orientación y nada más y no le gusta incluir otra gran biblioteca de JavaScript, escribí un pequeño código que extrae la etiqueta de orientación lo más rápido posible (utiliza DataView y readAsArrayBuffer
están disponibles en IE10 +, pero puede escribir su propio lector de datos para navegadores antiguos):
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' />
valores:
-2: not jpeg
-1: not defined
Para aquellos que usan Typecript, pueden usar el siguiente código:
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);
}
Puede usar la biblioteca exif-js en combinación con la API de archivos HTML5: http://jsfiddle.net/xQnMd/1/ .
fuente
Firefox 26 admite
image-orientation: from-image
: las imágenes se muestran en vertical u horizontal, según los datos EXIF. (Ver sethfowler.org/blog/2013/09/13/new-in-firefox-26-css-image-orientation ).También hay un error para implementar esto en Chrome .
Tenga en cuenta que esta propiedad solo es compatible con Firefox y es probable que sea obsoleta .
fuente
https://github.com/blueimp/JavaScript-Load-Image es una biblioteca moderna de JavaScript que no solo puede extraer el indicador de orientación exif, sino que también puede reflejar / rotar correctamente las imágenes JPEG en el lado del cliente.
Acabo de resolver el mismo problema con esta biblioteca: Orientación Exif del lado del cliente JS: rotar y reflejar imágenes JPEG
fuente
Si lo quieres entre navegadores, lo mejor es hacerlo en el servidor. Podría tener una API que tome una URL de archivo y le devuelva los datos EXIF; PHP tiene un módulo para eso .
Esto se puede hacer usando Ajax para que sea transparente para el usuario. Si no le importa la compatibilidad entre navegadores y puede confiar en la funcionalidad del archivo HTML5 , busque en la biblioteca JsJPEGmeta que le permitirá obtener esos datos en JavaScript nativo.
fuente
Vea un módulo que he escrito (puede usarlo en el navegador) que convierte la orientación exif a la transformación CSS: https://github.com/Sobesednik/exif2css
También existe este programa de nodo para generar dispositivos JPEG con todas las orientaciones: https://github.com/Sobesednik/generate-exif-fixtures
fuente
Subo el código de expansión para mostrar la foto de la cámara de Android en html de forma normal en alguna etiqueta img con rotación derecha, especialmente para la etiqueta img cuyo ancho es más ancho que la altura. Sé que este código es feo, pero no necesita instalar ningún otro paquete. (Utilicé el código anterior para obtener un valor de rotación exif, gracias).
y luego usar como
fuente
Mejorando / agregando más funcionalidad a la respuesta de Ali de antes, creé un método util en Typecript que se adaptaba a mis necesidades para este problema. Esta versión devuelve la rotación en grados que también podría necesitar para su proyecto.
Uso:
fuente