关于如何解码 Photoshop Liquify .msh 文件的任何想法?

逆向工程 解压 图形
2021-06-28 10:59:01

Photoshop 的液化滤镜允许您以多种不同方式交互式地扭曲图像。当您根据自己的喜好扭曲图像后,您可以将表示变换的网格保存在 .msh 文件中。然后可以加载此转换并将其应用于其他图像。我需要对 .msh 文件进行逆向工程,即使我以前从未解码过文件格式。以下是我到目前为止所想出的所有内容。

以前,.msh 文件只包含一个标题和一个未压缩的像素位移值数组。我知道这一点是因为该格式在开源项目中进行了逆向工程,例如Paint.NETgraphics32(参见 TVectorMap.LoadFromFile 和 SaveToFile)。这导致文件非常大,因此 Adob​​e 最终更新了格式以包含某种压缩。压缩非常有效(11.5 MB 的文件在以新格式重新保存时减少到 430 kB),但我不知道它是有损还是无损。据我所知,这些较新的压缩 .msh 文件尚未解码,但这是我需要做的。

新标头与旧标头非常相似,但我无法弄清楚使用了哪种压缩方式,因此无法读取实际数据。我在谷歌上搜索了一些常见的压缩格式及其签名,但没有发现任何有用的东西。

有什么技巧或实用程序可以帮助我确定压缩类型吗?任何其他想法可以引导我朝着正确的方向前进?

如果有人想看一看,我创建了几个大小不同的示例 .msh 文件以及演示正在应用的转换的 .png 图像。我在这里将它们上传到 MEGA(下载 1.3 MB):https ://mega.nz/#!We5QkARI!2-qD_qK2e8ADnYJcT578x9RxXo4uvBH0rXeDPeR-pRU

1个回答

这是 Adob​​e Photoshop CC 2019 上的 .msh 格式的描述,至少是我能够收集到的内容。

该格式使用游程编码对网格单元的偏移坐标进行编码,并沿途压缩空单元。

在此处输入图片说明

格式为小端。头是 64 字节。0x10 和 0x14 是网格宽度和高度,32 位整数。0x28 和 0x2c 是图像的高度和宽度,32 位整数。在 0x38 和 0x3c 处也发现了相同的图像高度和宽度。网格大小似乎总是图像大小的 1/4,所以你会得到 4 像素的网格单元。

编码的网格从 0x40 开始。每行网格单元都与其他行分开编码。

每一行都以连续的零偏移单元的数量开始,从左到右,32 位整数。如果最左边的单元格不为零,则该数字为零。然后,如果该行不完整,则出现 N 个连续的非零单元格。然后是 N 对 32 位浮点数。如果该行不完整,则出现连续零偏移量单元的数量,依此类推,直到该行完全编码。然后是具有零偏移单元数的下一行,依此类推,直到所有行都已编码。

在上面的例子中,我们有一个带有 8x8 网格的 32x32 图像。从 0x40 开始,我们有:

  • (第 1 行从这里开始)4 个零偏移单元格
  • 1 个非零单元格,2 个浮点数
  • 3 个零偏移单元格(该行现已完成)
  • (模式重复两行,直到 0x7c)
  • (第 4 行从这里开始)0 个零偏移单元格
  • 1 个非零单元格,2 个浮点数
  • 3 个零偏移单元
  • 1 个非零单元格,2 个浮点数
  • 3 个零偏移单元格(该行现已完成)

...等等。

编码的浮点对似乎是从当前像素到从中采样值的像素的 X 和 Y 偏移量。不过,不确定幅度是像素之间的距离还是单元格之间的距离。