在客户端用JavaScript访问JPEG EXIF旋转数据我想旋转照片的基础上,他们的原始旋转,由相机设置的JPEG EXIF图像数据。诀窍是,所有这些都应该发生在浏览器中,使用JavaScript和<canvas>.JavaScript如何访问JPEG,本地文件API对象,本地<img>或遥远<img>,EXIF数据读取旋转信息?服务器端的答案不太好,我正在寻找客户端解决办法。
3 回答
HUWWW
TA贡献1874条经验 获得超12个赞
readAsArrayBuffer
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' />
-2: not jpeg-1: not defined
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);}
添加回答
举报
0/150
提交
取消