Photoshop的Liquify滤镜可让您以多种不同方式交互式地变形图像。使图像变形后,可以将表示转换的网格保存在.msh文件中。然后可以加载此转换并将其应用于其他图像。即使以前从未解码过文件格式,我也需要对.msh文件进行反向工程。以下是到目前为止我所发现的所有内容。我知道这是因为格式是在开源项目(例如Paint.NET和graphics32)中进行反向工程的(请参阅TVectorMap.LoadFromFile和SaveToFile)。这导致了非常大的文件大小,因此Adobe最终对格式进行了更新,以包括某种压缩方式。压缩非常有效(以新格式重新保存时,一个11.5 MB的文件减少到430 kB),但是我不知道它是否有损或无损。据我所知,这些较新的压缩.msh文件尚未解码,但这是我需要做的。

新的标头与旧的标头非常相似,但我不知道使用了哪种压缩方式,所以我无法读取实际数据。我搜索了一些常见的压缩格式及其签名,但没有发现任何有用的信息。

是否有一个技巧或实用程序可以帮助我确定压缩的类型?还有其他想法可以引导我朝正确的方向发展吗?

如果有人想看一看,我创建了一些示例.msh文件,它们的大小各不相同,另外还有.png图像,它们证明了这种转换应用。我将它们上传到此处的MEGA(1.3 MB下载):https://mega.nz/#!We5QkARI!2-qD_qK2e8ADnYJcT578x9RxXo4uvBH0rXeDPeR-pRU

评论

看起来这些是浮点值的组; 2x(在它们之前的长值)。据我所知,没有压缩。

#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