Se você deseja apenas a tag de orientação e nada mais e não gosta de incluir outra enorme biblioteca javascript, escrevi um pequeno código que extrai a tag de orientação o mais rápido possível (ele usa o DataView e readAsArrayBuffer
está disponível no IE10 +, mas você pode escrever seu próprio leitor de dados para navegadores mais antigos):
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 aqueles que usam o Typecript, você pode usar o seguinte 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);
}
Você pode usar a biblioteca exif-js em combinação com a API de arquivos HTML5: http://jsfiddle.net/xQnMd/1/ .
fonte
O Firefox 26 suporta
image-orientation: from-image
: as imagens são exibidas em retrato ou paisagem, dependendo dos dados EXIF. (Consulte sethfowler.org/blog/2013/09/13/new-in-firefox-26-css-image-orientation .)Há também um erro para implementar isso no Chrome .
Lembre-se de que essa propriedade é suportada apenas pelo Firefox e provavelmente será preterida .
fonte
https://github.com/blueimp/JavaScript-Load-Image é uma biblioteca javascript moderna que não pode apenas extrair o sinalizador de orientação exif - mas também pode espelhar / girar corretamente imagens JPEG no lado do cliente.
Acabei de resolver o mesmo problema com esta biblioteca: JS Orientação Exif do lado do cliente: Girar e espelhar imagens JPEG
fonte
Se você quiser usar o navegador, sua melhor aposta é fazê-lo no servidor. Você pode ter uma API que utiliza uma URL de arquivo e retorna os dados EXIF; PHP tem um módulo para isso .
Isso pode ser feito usando o Ajax, para que seja fácil para o usuário. Se você não se importa com a compatibilidade entre navegadores e pode confiar na funcionalidade do arquivo HTML5 , consulte a biblioteca JsJPEGmeta que permitirá obter esses dados em JavaScript nativo.
fonte
Confira um módulo que eu escrevi (você pode usá-lo no navegador) que converte a orientação exif para a transformação CSS: https://github.com/Sobesednik/exif2css
Há também este programa de nó para gerar equipamentos JPEG com todas as orientações: https://github.com/Sobesednik/generate-exif-fixtures
fonte
Eu carrego o código de expansão para mostrar a foto pela câmera do Android em html como normal em alguma tag img com rotação correta, especialmente para tag img cuja largura é maior que a altura. Eu sei que esse código é feio, mas você não precisa instalar nenhum outro pacote. (Eu usei o código acima para obter o valor de rotação exif, obrigado.)
e depois use como
fonte
Melhorando / Adicionando mais funcionalidades à resposta de Ali, criei um método util no Typescript que atendia às minhas necessidades para esse problema. Esta versão retorna a rotação em graus que você também pode precisar para o seu projeto.
Uso:
fonte