前几天发现从网上找的那个修复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()
先说一下文件头, 绿色部分是IHDR数据, 里面的00 00 01 f4
是宽, 00 00 01 af
是高
红色部分是绿色部分的CRC32
在Windows中, 图片查看器不校验图片的CRC32, 所以高度修改后还可以正常的开, 但是在linux中会校验CRC32, 如果修改了宽高, 在Linux中就会报IHDR CRC错误, 所以可以把这个作为判断一个图片高度有没有被修改的方法。