在一个测试用例中使用纯JS检索图像方向失败

哈桑·拜格(Hassan Baig)

这些天,我是一个服务器端开发人员,正在学习纯JS的知识。我正在研究的一个实际示例是图像处理。这个问题是关于我为检索图像取向信息以随后旋转和/或反射它而做出的努力。

这个出色的答案使我开始。我写的代码是:

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

这适用于一系列图像,但是,这是一张导致行var tags = view.getUint16(offset, little);崩溃的图像RangeError: argument 1 accesses an index that is out of range

我无法判断图像是否损坏,或者代码是否需要更多专业化。专家可以帮助我进行调整以处理此类情况吗?提前致谢!

杰米吉南

该图像有一个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);
  ....

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

使用pytest的参数设置,如果一个测试用例失败,如何跳过其余测试?

如何生成一个查询,以检索测试周期中测试用例的数量?

测试一个函数,使用多个测试用例但只使用一个断言?

如果第一个测试用例失败,如何停止Robot Framework测试执行?

如何防止测试在第一个失败的测试用例上停止?

一个测试用例似乎干扰了另一个测试用例

使用 90 个测试用例进行测试时失败

需要说明一个测试用例在Codility Peaks问题中失败的情况

需要说明一个测试用例在Codility Peaks问题中失败的情况

Google Foobar挑战赛,一个测试用例失败

如果当前测试用例失败,如何跳过afterEach挂钩,并在此之后继续运行下一个测试用例?

在 Robot 框架中将变量从一个测试用例传递到另一个测试用例(不使用全局变量)

在一个测试用例上更新位错误

反应一个功能的测试用例

如何使用 XUnit 编写一个简单的测试用例?

Docker Image使用另一个映像运行测试用例

检索最后一个测试用例结果,包括与分支中最后一个构建相关的给定测试点

测试用例失败

使用Mockito的测试用例执行失败

如果我们在机器人框架中使用相同的关键字运行一个测试用例,如何将测试用例数指定为2?

硒自动化:什么应该是失败的测试用例在可接受的范围运行一个测试套件时,除了有效的失败?

Robot Framework API - 使用一个类获取测试套件/子套件结果和测试用例结果

如何在Protractor JS中为两个不同的浏览器设置一个测试用例?

在测试用例中使用if / switch / for条件

有没有办法检查分配的隐藏测试用例?该代码如下所示,但是一个隐藏测试失败了

测试失败,并出现Integrity约束违规错误,但是在第一个测试用例中它通过了。为什么?

使用Cucable插件并行执行黄瓜脚本时,范围报告仅显示一个测试用例结果

在同一个Django unittest测试用例中测试多个IntegrityErrors

在Robot框架中将变量从一个测试用例传递到另一个测试用例(全局变量)