使用纯JS在一个测试用例

时间:2018-03-09 21:49:47

标签: javascript orientation exif

我是服务器端开发人员,现在学习纯JS的绳索。我正在研究的一个实际例子是图像处理。这个问题是关于我努力检索图像方向信息以便随后旋转和/或反映它。

这个出色的SO answer让我开始了。我写的代码是:

// used to determine orientation information
function get_orientation(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.slice(0, 128 * 1024));
}

这适用于一系列图片,但here's one image导致行var tags = view.getUint16(offset, little);RangeError: argument 1 accesses an index that is out of range崩溃。

我无法判断图像是否已损坏,或者代码是否需要更多专业化。专家可以帮我调整这个来处理这样的情况吗?提前谢谢!

1 个答案:

答案 0 :(得分:1)

该图像有一个Exif块,但它是空的。

$ exif -x 28531470-85e0855a-70c9-11e7-9bba-107a664e6635.jpeg 
<exif>
</exif>

这是一个部分十六进制转储,

00000010: 0001 0000 ffe1 0008 4578 6966 0000 ffdb  ........Exif....

当它使用view.getUint32()调整偏移时,它使用来自ffdb块的量化数据。

您可以尝试读取标记长度,如果是<= 8,则跳过

while (offset < length) {
  var marker = view.getUint16(offset, false);
  var markerLength = view.getUint16(offset+2, false);
  ....