gpt4 book ai didi

javascript - 在客户端的 JavaScript 中访问 JPEG EXIF 旋转数据

转载 作者:IT王子 更新时间:2023-10-29 02:41:21 27 4
gpt4 key购买 nike

我想根据相机在 JPEG EXIF 图像数据中设置的原始旋转来旋转照片。诀窍是所有这一切都应该在浏览器中发生,使用 JavaScript 和 <canvas> .

JavaScript 如何访问本地文件 API 对象 JPEG,本地 <img>或远程 <img> ,EXIF数据读取旋转信息?

服务器端答案不正确;我正在寻找客户端解决方案。

最佳答案

如果您只想要方向标签而不需要其他任何东西并且不喜欢包含另一个庞大的 javascript 库我写了一些代码来尽可能快地提取方向标签(它使用 DataView 和 readAsArrayBuffer 在 IE10+ 中可用,但您可以为旧浏览器编写自己的数据读取器):

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' />

值(value)观:

-2: not jpeg
-1: not defined

enter image description here

对于使用 Typescript 的用户,您可以使用以下代码:

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);
}

关于javascript - 在客户端的 JavaScript 中访问 JPEG EXIF 旋转数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7584794/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com