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

这是一张图像,显示渲染ARGB数据的结果(省略了透明度,使制作起来更容易)。 />
PS3版屏幕截图:



PSP版屏幕截图:



我该怎么办想知道您是否知道这种颜色结构使用哪种逻辑?对我来说,它看起来像是在y轴上的最后一种颜色。其中零值只是获取y轴最后一个颜色的值。看起来我不得不一起对颜色进行求和。

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

AB = C,刚好带粉红色的粉红色。 />
x:0, y:24-27

R   G   B

137 195 255

240 254 000

014 000 255

001 001 001


这应该是带蓝色的颜色(与游戏屏幕截图相比),例如:145, 184, 219。也就是说,我是从使用另一种格式的另一个平台的同一游戏中获得的。由于图像尺寸不同。我可以说颜色与新颜色不是100%相同。 >
*请注意,游戏中比较的颜色不准确,图像具有透明度
同样,游戏也很可能将屏幕截图的颜色值弄乱了。 :)

评论

您是否尝试过系统地编辑字节的值? 0 0 0 0、0 0 0 255和/或255 0 0 0给您黑色吗? 255 255 255 0、0 255 255 255和/或255 255 255 255是否会给您白色?您是否尝试过将其余3个字节设置为零(或alpha可能为255),并且一次只设置一个字节为127,然后设置为255?然后对所有字节执行相同操作,将其他字节的值保持为零。这样,您应该能够确认红色,绿色,蓝色和Alpha通道字节的顺序,并查看其值是否被翻转。例如,

应该为纯色的水平线以及缺少垂直线的情况表明,每条“新”线都存储为与前一行的差异。 (等等,您尝试过😳)。好的,您看到了更好的东西。您是否正确处理溢出?

溢出,我尝试过说如果数字小于零,那么它应该使结果等于绝对数。也就是说,-35将变成35。我还尝试过说它应该导致255-35,但无济于事。 nrz给了我一个我正在尝试的想法。我会回来的发现

在普通的整数数学中,溢出将被忽略。用字节计数时,-35 = 256-35 =221。

只是一个想法:对于“不良”硬件,可以将4个字节拆分为2个字节,对于“良好”硬件,可以将其拆分为2个字节吗?因此,十六进制12345678表示在不支持完整8位RGB的显示器上显示(alpha 1,红色2,绿色3,蓝色4),而在完整显示上则表示(alpha 15,红色26,绿色37,蓝色48)颜色一?这种类型的编码可以使速度较慢的硬件完全不读取“高分辨率位”,与为每个像素分别丢弃这些位相比,可以节省CPU时间。

#1 楼

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

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

您的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图像相匹配,但是从源图像中的噪点开始,图像会失真。修复您的减压代码,图片将正确显示出来:)



评论


您是正确的,我注意到我的减压算法存在问题,并将其修复。之后,可以不加考虑地使用这种总和方法。

–patr0805
2014年9月24日上午11:09

#2 楼

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

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

评论


我认为cantordust对此无济于事,因为它会根据不同类型的输入创建不同的图形输出。它不会一点一点地将输入转换为图像。尽管如此,它似乎还是一个有趣的工具。我是否缺少某些内容,或者该网站没有下载/试用/联系链接?

–贡特拉姆·布洛姆(Guntram Blohm)
2014年3月30日22:23在