javascript - 使用 seikichi/tiff 库显示现有的 TIFF 文件

标签 javascript image tiff libtiff

这是我用来从输入元素加载文件的 JavaScript 代码。图片格式包括jpeg、png、tiff。

$(document).ready(function() {
  FileDetails = function() {

    var input = document.getElementById('fileUpload');
    var output = document.getElementById('tblUpload');

    //' + (URL || webkitURL).createObjectURL(input.files[i]) +'

    output.innerHTML = '<tr>';
    output.innerHTML += '<th class="thStyle" style="width: 400px;"><b>File Name</b></th><th class="thStyle" style="width: 150px;"><b>Preview Image</b></th>';
    for (var i = 0; i < input.files.length; ++i) {

      output.innerHTML += '<td style="padding: 10px; width: 400px;">' +
        input.files[i].name + '</td>' +
        '<td style="padding: 10px; width: 150px; color: #0d47a1">' +
        '<a target="_blank" href="' + (URL || webkitURL).createObjectURL(input.files[i]) + '">Show</a></td>';

    }
    output.innerHTML += '</tr>';
  }
});

现在,我如何使用 seikichi/tiff显示 tiff 文件的库?

我一直在测试各种图片格式,但 tiff 文件格式总是要求下载。其他如jpeg、png等均可显示。

最佳答案

您需要先将文件从 TIFF 格式转换。现在文件以二进制文件的形式传递,浏览器不知道如何处理它,因此它要求用户下载。

您需要实际使用 tiff 库来解析文件并将其转换为浏览器可以显示的内容。

步骤很简单:

var tiff = new Tiff({buffer: arrayBuffer});
var canvas = tiff.toCanvas();

但您首先需要将 File blob 转换为 ArrayBuffer。为此,您可以使用 FileReader()。然后,当您将 ArrayBuffer 传递给 TIFF 实例时。然后将结果转换为 Canvas 并显示。

实例

snapshot

注意:对于生产,您当然必须实现检查以查看文件是否确实是 Tiff(例如通过使用 file.type)、错误处理等。

document.querySelector("input").onchange = function() {

  // convert File blob to ArrayBuffer using a FileReader
  var fileReader = new FileReader();
  
  fileReader.onload = function() {                     // file is now ArrayBuffer:
    var tiff = new Tiff({buffer: this.result});        // parse and convert
    var canvas = tiff.toCanvas();                      // convert to canvas
    document.querySelector("div").appendChild(canvas); // show canvas with content
  };
  
  fileReader.readAsArrayBuffer(this.files[0]);         // convert selected file
};
<script src="https://cdn.rawgit.com/seikichi/tiff.js/master/tiff.min.js"></script>
<label>Select TIFF file: <input type=file></label><div></div>

因此,要加载多个文件,您可以在循环中执行相同的操作:

document.querySelector("input").onchange = function() {

  var files = this.files, fileReader;

  for(var i = 0; i < files.length; i++) {
    fileReader = new FileReader();
    fileReader.onload = handler;
    fileReader.readAsArrayBuffer(files[i]);            // convert selected file
  }
  
  function handler() {                                 // file is now ArrayBuffer:
    var tiff = new Tiff({buffer: this.result});        // parse and convert
    var canvas = tiff.toCanvas();                      // convert to canvas
    document.querySelector("div").appendChild(canvas); // show canvas with content
  };
};
<script src="https://cdn.rawgit.com/seikichi/tiff.js/master/tiff.min.js"></script>
<label>Select TIFF file: <input type=file multiple></label><div></div>

关于javascript - 使用 seikichi/tiff 库显示现有的 TIFF 文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42847915/

相关文章:

image - 将自定义字段图像转换为 WordPress 中的特色图像?

tiff - 如何确定 tiff 是否以 bigtiff 格式编写

javascript - Vuejs 2 : debounce not working on a watch option

android - 花时间在android中加载背景图片

javascript对象数组没有改变

html - Tumblr 文本帖子上的图片说明

c++ - 如何从 C++ 中的 Base64 编码字符串在 GDI+ 中创建图像?

linux - 使用 Linux 命令行 (FAX) 将 PDF 转换为 TIFF

javascript - onunload如何才能正常工作?

javascript - 查找捕获的起始索引(以字符串形式)[JS/RegExp]