新的标头与旧的标头非常相似,但我不知道使用了哪种压缩方式,所以我无法读取实际数据。我搜索了一些常见的压缩格式及其签名,但没有发现任何有用的信息。
是否有一个技巧或实用程序可以帮助我确定压缩的类型?还有其他想法可以引导我朝正确的方向发展吗?
如果有人想看一看,我创建了一些示例.msh文件,它们的大小各不相同,另外还有.png图像,它们证明了这种转换应用。我将它们上传到此处的MEGA(1.3 MB下载):https://mega.nz/#!We5QkARI!2-qD_qK2e8ADnYJcT578x9RxXo4uvBH0rXeDPeR-pRU
#1 楼
这是对Adobe Photoshop CC 2019上.msh格式的描述,至少是我能够收集到的内容。该格式使用游程长度编码来编码网格单元的偏移坐标并压缩空单元格。
格式为小端。标头是64个字节。在0x10和0x14处是网格的宽度和高度,是32位整数。在0x28和0x2c处是图像的高度和宽度,是32位整数。在0x38和0x3c处也发现了相同的图像高度和宽度。网格大小似乎始终是图像大小的1/4,因此您将获得4像素的网格单元。
编码的网格从0x40开始。网格单元格的每一行都与其他行分开进行编码。如果最左边的单元格非零,则此数字为零。然后,如果该行不完整,则连续的非零像元数为N。然后是N对32位浮点数。如果行不完整,则会出现连续的零偏移像元数,依此类推,直到行被完全编码为止。然后是下一行带有零偏移像元数的行,依此类推,直到所有行都被编码为止。从0x40开始,我们有:
(第1行从这里开始)4个零偏移像元
1个非零像元,两个浮点数
3个零偏移像元(该行现在已完成)
(该模式会再重复两行,直到0x7c)
(第4行从此处开始)0个零偏移单元格
1个非零单元格,2个浮点数
3个零偏移像元
1个非零像元,2个浮点数
3个零偏移像元(行已完成)
...等等。
编码的浮点对似乎是从当前像素到要对其采样值的像素的X和Y偏移。不过,不确定大小是像素之间的距离还是像元之间的距离。
评论
我用您的答案来创建一个简单的Java实现,展示了它。 gist.github.com/johantiden/a9ec7bc4dfeb9ebc23260d6c0a159317
–约翰·提登(JohanTidén)
19-10-23在13:52
评论
看起来这些是浮点值的组; 2x(在它们之前的长值)。据我所知,没有压缩。