我正在编写一个Web应用程序来显示和处理.tif文件。我需要从文件中检索xResolution
和yResolution
,以便可以将它们用于某些转换。要在浏览器中阅读和显示.tif文件,我正在使用 Tiff.js (https://github.com/seikichi/tiff.js)。
Tiff.js 包含一种getField()
方法,该方法应从.tif标记中检索元数据。检索xResolution
(标签282)和yResolution
(标签283)似乎没有返回正确的数据。
此问题的一部分似乎源于.tif文件存储分辨率值的方式。 AWARE系统TIFF标记查看器(https://www.awaresystems.be/imaging/tiff/astifftagviewer.html)使用称为'rational'的数据类型报告分辨率。我相信这是一个包含32位分子和32位分母的单个64位值。在我可以访问的内部应用程序中,此分辨率数据是通过使用位转换器来拆分64位值并将每个一半转换为32位整数来检索的。然后将这些值转换为浮点数,然后进行除法以获得正确的分辨率。
我一直找不到使用JavaScript完成同一件事的好方法。因为我们无法使用JavaScript显式定义数据类型,所以 Tiff.js 中的getField()
方法仅返回一个数字(似乎没有用)。
下面是我正在尝试使用的简化版本的类。注释应显示我当前能够获得的各种值:
class TiffImage {
constructor(url) {
this.imageURL = boardType;
}
this.width;
this.height;
this.canvas;
this.xResolution;
this.yResolution;
}
async loadImage() {
// retrieve tiff and convert it to an html5 canvas
return fetch(this.imageURL)
.then((response) => {
return response.arrayBuffer();
})
.then((buffer) => {
// handle tiff image
let tiff = new Tiff({buffer: buffer});
this.width = tiff.width();
this.height = tiff.height();
// try to grab resolutions
this.xResolution = tiff.getField(282);
this.yResolution = tiff.getField(283);
console.log('xRes: ' + this.xResolution);
// prints 'xRes: 1098514432'
console.log('yRes: ' + this.yResolution);
// prints 'yRes: 1081737216'
console.log('xRes as bin: ' + this.xResolution.toString(2);
// prints 'xRes as bin: 1000001011110100000000000000000'
console.log('yRes as bin: ' + this.yResolution.toString(2);
// prints 'yRes as bin: 1000000011110100000000000000000'
this.canvas = tiff.toCanvas();
// do stuff with image
}
}
我不确定getField()
返回的数字在做什么JavaScript。我得到的二进制值看起来很修整,无法将它们与图像的实际值相关联。
要解决这个问题,我想我可以将每种分辨率的二进制数据作为字符串,然后将其拆分以进行相应的解析。
这些是我尝试从正在使用的图像之一中获取的实际期望值:
XResolution: 15.625
十六进制: 00 00 00 7D 00 00 00 08 --- 这应得出125/8,其等于等于15.625
更新:在使用了一些计算器之后,我认为我已经对如何构造这些值进行了更多的研究:
7D 00 == 32000
08 00 == 2048
32000/2048 is equal to 15.625
Y分辨率: 3.90625
十六进制: 00 00 40 1F 00 00 00 08 --- 我不知道这40个因素如何... 1F应该等于31和31 / 8等于3.875,有点差。我还没有完全弄清楚这一点...
更新:如上所述:
1F 40 == 8000
08 00 == 2048
8000/2048 is equal to 3.90625
上面块中的值正是我所期望的,因此我希望机器处理这样的值是有意义的。此外,建立一个从右向左移动的十六进制的逐字节二进制表示形式,并省略空字节似乎与我从JavaScript获取的二进制字符串非常接近(我必须在末尾添加两个零字节) (用于填充),但如果发生的情况有明确的模式,或者我只是在胡说八道,我就无法放在一起:
JavaScript输出与二进制计算器:
XResolution:
JS Output: 1000001011110100000000000000000
08 7D 00 00: 1000011111010000000000000000
YResolution:
JS Output: 1000000011110100000000000000000
08 1F 40 00: 1000000111110100000000000000
任何见识将不胜感激,
谢谢!