从JavaScript中的.tif文件检索XResolution和YResolution

时间:2019-07-18 22:25:11

标签: javascript node.js tiff libtiff

我正在编写一个Web应用程序来显示和处理.tif文件。我需要从文件中检索xResolutionyResolution,以便可以将它们用于某些转换。要在浏览器中阅读和显示.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

任何见识将不胜感激,

谢谢!

0 个答案:

没有答案