在这种未知的图像格式中表示颜色的方式是什么

逆向工程 文件格式
2021-06-22 10:10:26

好吧,我有一个用 LZ 算法(魔术字节43 5A 32 00的变体压缩的 PS3 图像(我已经成功解压缩了它),我从解压缩的形式中得到的是一组 ARGB 颜色/像素(在压缩文件4*width*height因此我知道解压缩文件可能只包含原始 ARGB 数据)。

这是一张说明渲染 ARGB 数据结果的图像(省略了透明度以使事情更容易辨认)。

解压后的图片: 在此处输入图片说明

PS3版截图:

在此处输入图片说明

PSP版截图:

在此处输入图片说明

我想知道的是你们有没有人知道这种颜色结构使用什么样的逻辑?对我来说,它看起来像是在 y 轴方面的最后一种颜色。其中零值仅获取 y 轴的最后一种颜色的值。看起来我必须将颜色区分/求和。

我尝试过各种方法。例如,在这里我尝试存储一个颜色为零的颜色数组,对于每一行,将数组中 x 位置的 ARGB 的无符号整数表示与新颜色的无符号整数相加 -> A+B = C

在此处输入图片说明

AB=C,只是给出了粉红色的胡言乱语..

以下是我用来尝试寻找解决方案的一些 ARGB 值示例:

x:0, y:24-27

R   G   B

137 195 255

240 254 000

014 000 255

001 001 001

这应该给一个青色的颜色(比较游戏截图),如:145, 184, 219

*请注意,我的比较图像并不准确。也就是说我是从另一个平台的同一个游戏中得到的,使用了另一种格式。由于图像大小不同。我可以说颜色与新颜色不是 100% 相同。

x:4, y:22-28

R   G   B

137 195 255

118 168 201

255 204 161

这也应该给出深蓝色,如:020, 068, 096

*请注意游戏中对比的颜色不准确,图片也有透明度,所以可能是游戏截图的颜色值弄乱了。

所以如果有人以前遇到过这样的事情并且可以给我一些提示,我会很高兴。:)

2个回答

你几个月前问过这个问题,但我还是要回答。

首先,我担心你的解压代码有问题。有几条水平的噪音线,我很确定它们不应该在那里。

你的A+B=C猜测是正确的。一个明显的标志是可见的水平边缘但隐藏的垂直边缘。我认为您的错误只是以错误的字节顺序进行加法。

我写了一个小 Python 脚本:

from PIL import Image
im = Image.open('orig.png')
w, h = im.size
pix = im.load()
def add(p, q):
    # Convert (R,G,B) tuples to RGB integers, add them, and convert back
    pp = (p[0] << 16) + (p[1] << 8) + p[2]
    qq = (q[0] << 16) + (q[1] << 8) + q[2]
    r = pp + qq
    return ((r >> 16) & 0xFF, (r >> 8) & 0xFF, r & 0xFF)
for y in range(1, h):
    for x in range(w):
        pix[x,y] = add(pix[x, y], pix[x, y-1])
im.save('out.png')

结果就是这张图。您可以看到前三分之一与 PSP 图像匹配,但从源图像中的噪声线开始,图像变得失真。修复你的解压代码,图片就出来了:)

处理过的图像

不知道我会怎么做,但是有一个名为 cantordust 的工具可以帮助解决这个问题,它可以将二进制信息可视化为象形图。链接在下面。

https://sites.google.com/site/xxcantorxdustxx/