Во время работы над веб-проектом у меня возникли проблемы с установкой ориентации изображений, снятых с определенных устройств. Я обнаружил, что ориентация (вместе с кучей других метаданных изображения) доступна как часть exif изображения и может быть проанализирована тоже. После небольшого поиска я нашел следующую функцию, которая извлекает ориентацию из изображения, и, используя эту информацию, я мог исправить ориентацию при отображении в браузере. У меня проблемы с пониманием приведенного ниже фрагмента кода. Первый контрольно-пропускной пункт, на который я наткнулся, пытался выяснить цель DataView
и getUint16
. Я просмотрел документы MDN, но это мне не сильно помогло. Может ли кто-нибудь помочь мне понять это? Или даже ссылки на соответствующие ресурсы будут очень полезны.
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) {
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);
}