Python3 PNG文件格式及根据CRC检验码修复图片高度

PNG文件头部格式如下:

- (固定)八个字节89 50 4E 47 0D 0A 1A 0A为png的文件头
- (固定)四个字节00 00 00 0D(即为十进制的13)代表数据块的长度为13
- (固定)四个字节49 48 44 52(即为ASCII码的IHDR)是文件头数据块的标示(IDCH)
- (可变)13字节数据块(IHDR)
    - 前四个字节代表该图片的宽
    - 后四个字节代表该图片的高
    - 后五个字节依次为:
    Bit depth、ColorType、Compression method、Filter method、Interlace method
- (可变)剩余四字节为该png的CRC检验码,由从IDCH到IHDR的十七字节进行crc计算得到。

 

若PNG文件宽度出现错误,我们可以根据CRC码对文件进行校验,还原出正确的图片宽度

下面是一个对宽度受损的图片根据CRC值进行宽度搜索的例子:

import struct
import  binascii
import os

fi=open('d21007e64ba84021875c3556ece71173.png','rb').read()

#12-15字节代表固定的文件头数据块的标示,16-19字节代表宽度,20-23字节代表高度,24-28字节分别代表
# Bit depth、ColorType、Compression method、Filter method、Interlace method
#29-32字节为CRC校验和

for i in range(10000):#宽度0-9999搜索
    data=fi[12:16]+struct.pack('>I',i)+fi[20:29]  #pack函数将int转为bytes,>表示大端00 00 00 02,I表示4字节无符号int;<表示小端 02 00 00 00
    crc=binascii.crc32(data)&0xffffffff #byte的大小为8bits而int的大小为32bits,转换时进行与运算避免补码问题0x932f8a6b
    if crc==struct.unpack('>I',fi[29:33])[0]&0xffffffff : #解开为无符号整数
        print(i)


参考链接:

https://blog.csdn.net/jackyzhousales/article/details/78030847

https://blog.csdn.net/persist213/article/details/79374914

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值