前几天发现从网上找的那个修复PNG宽高的脚本不好用了, 今天仔细研究了一下, 其实修改一行代码就可以啦

import binascii
import struct
import sys

file = input("图片地址:")
fr = open(file,'rb').read()
data = bytearray(fr[0x0c:0x1d])
crc32key = int.from_bytes(fr[0x1d:0x21], byteorder='big')

n = 4095
for w in range(n):
    width = bytearray(struct.pack('>i', w))
    for h in range(n):
        height = bytearray(struct.pack('>i', h))
        for x in range(4):
            data[x+4] = width[x]
            data[x+8] = height[x]
        crc32result = binascii.crc32(data) & 0xffffffff
        if crc32result == crc32key:
            print(width,height)
            newpic = bytearray(fr)
            for x in range(4):
                newpic[x+16] = width[x]
                newpic[x+20] = height[x]
            fw = open(file+'.png','wb')
            fw.write(newpic)
            fw.close
            sys.exit()

QQ截图20200306184859.png

先说一下文件头, 绿色部分是IHDR数据, 里面的00 00 01 f4是宽, 00 00 01 af是高
红色部分是绿色部分的CRC32
在Windows中, 图片查看器不校验图片的CRC32, 所以高度修改后还可以正常的开, 但是在linux中会校验CRC32, 如果修改了宽高, 在Linux中就会报IHDR CRC错误, 所以可以把这个作为判断一个图片高度有没有被修改的方法。

最后修改:2023 年 03 月 17 日
如果觉得我的文章对你有用,请随意赞赏